hdu4506小明系列故事——师兄帮帮忙 (用二进制,大数高速取余)
生活随笔
收集整理的這篇文章主要介紹了
hdu4506小明系列故事——师兄帮帮忙 (用二进制,大数高速取余)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Problem Description 小明自從告別了ACM/ICPC之后,就開始潛心研究數學問題了,一則能夠為接下來的考研做準備,再者能夠借此機會幫助一些同學,尤其是美麗的師妹。這不,班里唯一的女生又拿一道數學題來請教小明,小明當然非常高興的就接受了。只是等他細致讀題以后,發現自己也不會做,這下小明囧了:假設回復說自己不懂,豈不是非常沒面子?
所以,他如今私下求你幫忙解決這道題目,題目是這種:
給你n個數字,各自是a1,a2,a3,a4,a5……an,這些數字每過一個單位時間就會改變,如果上一個單位時間的數字為a1’,a2’,a3’……an’,那么這個單位時間的數字a[i] = a[i - 1]’ * K(i == 1的時候a[1] = a[n]’ * K),當中K為給定的系數。
如今的問題就是求第t單位時間的時候這n個數字變成了什么了?因為數字可能會非常大,所以僅僅要你輸出數字對10^9 + 7取余以后的結果。
Input 輸入數據第一行是一個正整數T,表示有T組測試數據;
每組數據有兩行,第一行包括輸入三個整數n, t, k,當中n代表數字個數,t代表第t個單位時間,k代表系數;第二行輸入n個數字ai,代表每一個數字開始的時候是多少。
[Technical Specification]
T <= 100
1 <= n <= 10 ^ 4
0 <= t <= 10 ^ 9 當中 t = 0 表示初始狀態
1 <= k <= 10 ^ 9
1 <= ai<= 10 ^ 9
Output 對于每組數據請輸出第t單位時間后這n個數字變成了什么,輸出的時候每兩個數字之間輸出一個空格,行末不要輸出多余的空格,詳細見例子。
Sample Input 2 3 2 5 1 2 3 3 0 5 1 2 3
Sample Output 50 75 25 1 2 3#include<stdio.h> #define mod 1000000007 int main() {int n,m,k,i,t;__int64 aa[60],ans[100005],sum;scanf("%d",&t);while(t--){scanf("%d%d%d",&n,&m,&k);for(i=1;i<=n;i++){scanf("%I64d",&ans[i]);ans[i]%=mod;}int tk=m,ti=0,a[60];while(tk){a[++ti]=tk%2; tk/=2; }aa[1]=k%mod;for(i=2; i<=ti;i++)aa[i]=(aa[i-1]*aa[i-1])%mod;sum=1;for(i=1; i<=ti; i++)if(a[i])sum=(sum*aa[i])%mod;tk=m%n;if(tk)printf("%I64d",(ans[n-tk+1]*sum)%mod),ti=n-tk+1;else printf("%I64d",(ans[1]*sum)%mod),ti=1;if(ti==1)for(i=2;i<=n;i++)printf(" %I64d",(ans[i]*sum)%mod);else{i=ti-1;for(ti++; ti<=n; ti++)printf(" %I64d",(ans[ti]*sum)%mod);for(ti=1;ti<=i; ti++)printf(" %I64d",(ans[ti]*sum)%mod);}printf("\n");}return 0; }
所以,他如今私下求你幫忙解決這道題目,題目是這種:
給你n個數字,各自是a1,a2,a3,a4,a5……an,這些數字每過一個單位時間就會改變,如果上一個單位時間的數字為a1’,a2’,a3’……an’,那么這個單位時間的數字a[i] = a[i - 1]’ * K(i == 1的時候a[1] = a[n]’ * K),當中K為給定的系數。
如今的問題就是求第t單位時間的時候這n個數字變成了什么了?因為數字可能會非常大,所以僅僅要你輸出數字對10^9 + 7取余以后的結果。
Input 輸入數據第一行是一個正整數T,表示有T組測試數據;
每組數據有兩行,第一行包括輸入三個整數n, t, k,當中n代表數字個數,t代表第t個單位時間,k代表系數;第二行輸入n個數字ai,代表每一個數字開始的時候是多少。
[Technical Specification]
T <= 100
1 <= n <= 10 ^ 4
0 <= t <= 10 ^ 9 當中 t = 0 表示初始狀態
1 <= k <= 10 ^ 9
1 <= ai<= 10 ^ 9
Output 對于每組數據請輸出第t單位時間后這n個數字變成了什么,輸出的時候每兩個數字之間輸出一個空格,行末不要輸出多余的空格,詳細見例子。
Sample Input 2 3 2 5 1 2 3 3 0 5 1 2 3
Sample Output 50 75 25 1 2 3#include<stdio.h> #define mod 1000000007 int main() {int n,m,k,i,t;__int64 aa[60],ans[100005],sum;scanf("%d",&t);while(t--){scanf("%d%d%d",&n,&m,&k);for(i=1;i<=n;i++){scanf("%I64d",&ans[i]);ans[i]%=mod;}int tk=m,ti=0,a[60];while(tk){a[++ti]=tk%2; tk/=2; }aa[1]=k%mod;for(i=2; i<=ti;i++)aa[i]=(aa[i-1]*aa[i-1])%mod;sum=1;for(i=1; i<=ti; i++)if(a[i])sum=(sum*aa[i])%mod;tk=m%n;if(tk)printf("%I64d",(ans[n-tk+1]*sum)%mod),ti=n-tk+1;else printf("%I64d",(ans[1]*sum)%mod),ti=1;if(ti==1)for(i=2;i<=n;i++)printf(" %I64d",(ans[i]*sum)%mod);else{i=ti-1;for(ti++; ti<=n; ti++)printf(" %I64d",(ans[ti]*sum)%mod);for(ti=1;ti<=i; ti++)printf(" %I64d",(ans[ti]*sum)%mod);}printf("\n");}return 0; }
總結
以上是生活随笔為你收集整理的hdu4506小明系列故事——师兄帮帮忙 (用二进制,大数高速取余)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: centos 6.5网卡固定IP重启出错
- 下一篇: 覆盖统计