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