hdu 4506
一个a序列,每一次变化a[i] = a[i - 1]’ * K,序列长n,有t次变化。
里头有个二分降幂,然后有个排序。
这里头有个好思路,就是,每个数都会乘以k的t次幂,那么用t%n就知道a0要推迟多少个位置,由于位置只是颠倒一下,但顺序没变,则好排序。
所以先排序,在执行乘法是个好思路。
#include<stdio.h>
#define Mod 1000000007
int main()
{
int T,n,i,dis;
__int64 t,k,count,tt;
__int64 a[10005],b[10005];
while(~scanf("%d",&T))
while(T--)
{
scanf("%d",&n);
scanf("%I64d%I64d",&t,&k);
tt=t;
count=1;
while(tt)
{
if(tt&1)
count=(count*k)%Mod;
tt/=2;
k=(k%Mod)*(k%Mod);
k%=Mod;
}
for(i=0;i<n;i++)
{
scanf("%I64d",&a[i]);
b[i]=(a[i]*count)%Mod;
}
dis=t%n;
int temp;
temp=n-dis;
for(i=0;i<dis;i++)
a[i]=b[temp++];
temp=0;
for(i=dis;i<n;i++)
a[i]=b[temp++];
for(i=0;i<n;i++)
(i!=n-1)?printf("%I64d ",a[i]):printf("%I64d",a[i]);
printf("\n");
}
}