分析: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