您的位置:首页 > 其它

HDU 4506 小明系列故事——师兄帮帮忙(二分快速幂)

2014-03-15 22:40 253 查看
题意:就是输入一个数组,这个数组在不断滚动,而且每滚动一次后都要乘以一个数,用公式来说就是a[i] = a[i-1] * k;然后最后一位的滚动到第一位去。

解题报告:因为题目中的k要乘很多次,达到了10^9级别,所以,这题其实就是一个二分快速幂,先求出k的t次方,然后只要注意下输出时不一定是从数组的第一个数开始输出就是 了。

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
typedef __int64 INT;
const INT MOD = 1000000007;
INT que[10005];
INT qpower(INT k,INT t)
{
INT temp = 1;
INT ret = k;
while(t)
{
if(t & 1) temp *= ret;
temp %= MOD;
t >>= 1;
ret *= ret;
ret %= MOD;
}
return temp;
}
int main()
{
int T;
scanf("%d",&T);
INT n,t,k,temp;
while(T--)
{
scanf("%I64d%I64d%I64d",&n,&t,&k);
for(int i = 0;i < n;++i)
scanf("%I64d",&que[i]);
temp = qpower(k,t);
for(int i = 0;i < n;++i)
que[i] = (que[i] * temp) % MOD;
int f = 0;
for(int i = (n - t % n) % n;f < n;f++)
{
printf(f? " %I64d":"%I64d",que[i]);
i = (i + 1) % n;
}
printf("\n");
}
return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: