hdu 4506

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");
     }

}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值