分析:t单位时间后i的位置将变化到(i+t)%n位置上,下标i从0开始,之后快速幂完成。
#include<iostream>
using namespace std;
__int64 f_pow(__int64 a,__int64 b,__int64 mod)
{
__int64 s=1;
while(b>0)
{
if(b&1) s=s*a%mod;
a=a*a%mod;
b>>=1;
}
return s;
}
int main()
{
int T;
__int64 n,t,k,ai,a[10005],i;
scanf("%d",&T);
while(T--)
{
scanf("%I64d%I64d%I64d",&n,&t,&k);
for(i=0;i<n;i++)
{
scanf("%I64d",&ai);
a[(i+t)%n]=ai*f_pow(k,t,(__int64)1000000007)%1000000007; //(i+t)%n相当于第t轮后的位置情况
}
printf("%I64d",a[0]);
for(i=1;i<n;i++)
printf(" %I64d",a[i]);
printf("\n");
}
return 0;
}
HDU ACM 4506 小明系列故事——师兄帮帮忙 ->简单快速幂
原文地址:http://blog.csdn.net/a809146548/article/details/45853289