本文主要是介绍hdu 4506,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
hdu 4506
一个a序列,每一次变化a[i] = a[i - 1]’ * K,序列长n,有t次变化。
里头有个二分降幂,然后有个排序。
这里头有个好思路,就是,每个数都会乘以k的t次幂,那么用t%n就知道a0要推迟多少个位置,由于位置只是颠倒一下,但顺序没变,则好排序。
所以先排序,在执行乘法是个好思路。
#include<stdio.h>
#define Mod 1000000007int 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");}}
这篇关于hdu 4506的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!