题目描述
解题思路
找规律,可知每经过n个单位时间,数字又会变回来.
因此只要取余,得到每个数字在t时间后的位置. 结合快速幂就可以直接输出答案了.
参考代码
#include <iostream>
#include <vector>
#include <algorithm>
#define MOD 1000000007
const int maxn = 10010;
typedef long long ll;
ll v[maxn];
using namespace std;
ll quickpow(ll m,ll n)
{
ll ans = 1;
while (n){
if (n & 1)
ans = (ans*m)%MOD;
n >>= 1;
m = (m*m)%MOD;
}
return ans;
}
int main()
{
int T;
while (~scanf("%d",&T)){
while (T--){
ll n,t,k,num,w,base;
scanf("%I64d %I64d %I64d",&n,&t,&k);
for (int i = 0;i < n;i++)
scanf("%I64d",&v[i]);
w = t%n;
base = quickpow(k,t);
for (int i = 0;i < n;i++)
printf("%I64d%s",v[(i-w+n)%n]*base%MOD,i == n-1 ?"\n":" ");
}
}
return 0;
}