首页 > 其他 > 详细

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

时间:2014-03-17 13:32:30      阅读:402      评论:0      收藏:0      [点我收藏+]

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

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

bubuko.com,布布扣
 1 #include<cstdio>
 2 #include<cstring>
 3 #include<iostream>
 4 #include<algorithm>
 5 using namespace std;
 6 typedef __int64 INT;
 7 const INT MOD = 1000000007;
 8 INT que[10005];
 9 INT qpower(INT k,INT t)
10 {
11     INT temp = 1;
12     INT ret = k;
13     while(t)
14     {
15         if(t & 1) temp *= ret;
16         temp %= MOD; 
17         t >>= 1;
18         ret *= ret;
19         ret %= MOD;
20     }
21     return temp;
22 }
23 int main()
24 {
25     int T;
26     scanf("%d",&T);
27     INT n,t,k,temp;
28     while(T--)
29     {
30         scanf("%I64d%I64d%I64d",&n,&t,&k);
31         for(int i = 0;i < n;++i)
32         scanf("%I64d",&que[i]);
33         temp = qpower(k,t);
34         for(int i = 0;i < n;++i)
35         que[i] = (que[i] * temp) % MOD;
36         int f = 0;
37         for(int i = (n - t % n) % n;f < n;f++)
38         {
39             printf(f? " %I64d":"%I64d",que[i]);
40             i = (i + 1) % n;
41         }
42         printf("\n");
43     }
44     return 0;
45 }
View Code

HDU 4506 小明系列故事——师兄帮帮忙(二分快速幂),布布扣,bubuko.com

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

原文:http://www.cnblogs.com/xiaxiaosheng/p/3602727.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!