题意:就是输入一个数组,这个数组在不断滚动,而且每滚动一次后都要乘以一个数,用公式来说就是a[i] = a[i-1] * k;然后最后一位的滚动到第一位去。
解题报告:因为题目中的k要乘很多次,达到了10^9级别,所以,这题其实就是一个二分快速幂,先求出k的t次方,然后只要注意下输出时不一定是从数组的第一个数开始输出就是 了。
1 #include<cstdio> 2 #include<cstring> 3 #include<iostream> 4 #include<algorithm> 5 using namespace std; 6 typedef __int64 INT; 7 const INT MOD = 1000000007; 8 INT que[10005]; 9 INT qpower(INT k,INT t) 10 { 11 INT temp = 1; 12 INT ret = k; 13 while(t) 14 { 15 if(t & 1) temp *= ret; 16 temp %= MOD; 17 t >>= 1; 18 ret *= ret; 19 ret %= MOD; 20 } 21 return temp; 22 } 23 int main() 24 { 25 int T; 26 scanf("%d",&T); 27 INT n,t,k,temp; 28 while(T--) 29 { 30 scanf("%I64d%I64d%I64d",&n,&t,&k); 31 for(int i = 0;i < n;++i) 32 scanf("%I64d",&que[i]); 33 temp = qpower(k,t); 34 for(int i = 0;i < n;++i) 35 que[i] = (que[i] * temp) % MOD; 36 int f = 0; 37 for(int i = (n - t % n) % n;f < n;f++) 38 { 39 printf(f? " %I64d":"%I64d",que[i]); 40 i = (i + 1) % n; 41 } 42 printf(" "); 43 } 44 return 0; 45 }