2 3 2 5 1 2 3 3 0 5 1 2 3
50 75 25 1 2 3
/**
*@xiaoran
*快速幂问题,相当于a[i]=a[i-1]*(k^t)%MOD
*有上式可知:最后的序列是有a[i]=a[i]*(k^t)%MOD组成,
*手动模拟一下就知道输出的位置了,对于3 2 5 k^t=25
*输入序列为:1 2 3
*直接运算后的序列:25 75 50
*手动模拟结果
*第一次:15 5 10
*第二次:50 75 25
*与直接结果比较,需要将上式左移t=2位即可
*因此可以直接得出序列组成,输出a[(i-t+n)%n]
*/
#include<iostream>
#include<cstdio>
#include<map>
#include<cstring>
#include<string>
#include<algorithm>
#include<queue>
#include<vector>
#include<stack>
#include<cstdlib>
#include<cctype>
#include<cmath>
#define LL long long
#define MOD 1000000007
using namespace std;
LL a[10005],b[10005];
LL qpow(LL a,LL b){//a^b非递归
if(b==0) return 1;
LL res=1,tp=a;
while(b){
if(b&1) res*=tp;
res%=MOD;
b=b>>1;
tp=(tp*tp)%MOD;
}
return res%MOD;
}
LL qpow1(LL a,LL b){//a^b递归
LL t = 1;
if(b == 0) return 1;
if (b == 1) return a%MOD;
t = qpow1(a, b>>1);
t = t*t % MOD;
if (b&1){//b是奇数
t = t*a % MOD;
}
return t;
}
int main()
{
int n,c; LL k,t;
//cout<<qpow(2,3)<<endl;
scanf("%d",&c);
while(c--){
scanf("%d%lld%lld",&n,&t,&k);
LL tmp=qpow(k,t);
//LL tmp=qpow1(k,t);
for(int i=0;i<n;i++){
scanf("%lld",&a[i]);
a[i]=a[i]*tmp%MOD;//得到最后序列集合
}
t=t%n;
printf("%lld",a[(0-t+n)%n]);
for(int i=1;i<n;i++){
printf(" %lld",a[(i-t+n)%n]);
}
printf("\n");
}
return 0;
}
hdu4506 小明系列故事——师兄帮帮忙 (规律模拟+快速幂)
原文:http://blog.csdn.net/fool_ran/article/details/42528013