码迷,mamicode.com
首页 > 其他好文 > 详细

hihocoder1777 彩球

时间:2018-07-09 01:08:12      阅读:166      评论:0      收藏:0      [点我收藏+]

标签:div   思想   std   hoc   end   int   cin   ret   scanf   

思路:

记录一下快速幂计算过程中爆long long的两种解决方法:

1. 使用__int128,这玩意本地编译不通过,提交OJ能AC。

实现:

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 typedef long long LL;
 4 
 5 __int128 qpow(__int128 a, __int128 b, __int128 mod) 
 6 {
 7     __int128 ret = 1LL;
 8     while (b) 
 9     {
10         if (b & 1) ret = ret * a % mod;
11         a = a * a % mod;
12         b >>= 1;
13     }
14     return ret;
15 }
16 
17 int main() 
18 {
19     LL n, k, P;
20     scanf("%lld %lld %lld", &n, &k, &P);
21     LL ans = qpow(k, n, P);
22     printf("%lld\n", ans);
23     return 0;
24 }

2. 利用和快速幂类似的思想实现如下不会溢出的乘法操作。

实现:

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 typedef long long LL;
 4 LL n, k, p;
 5 LL mul(LL a, LL b)
 6 {
 7     LL ans = 0;
 8     while (b)
 9     {
10         if (b & 1) ans = (ans + a) % p;
11         a = (a + a) % p;
12         b = b >> 1;
13     }
14     return ans;
15 }
16 
17 LL Pow(LL a, LL b)
18 {
19     LL result = 1;
20     LL base = a % p;
21     while (b)
22     {
23         if (b & 1) result = mul(result, base) % p;
24         base = mul(base, base) % p;
25         b = b >> 1;
26     }
27     return result;
28 }
29 
30 int main()
31 {
32     cin >> n >> k >> p;
33     cout << Pow(k, n) << endl;
34     return 0;
35 }

 

hihocoder1777 彩球

标签:div   思想   std   hoc   end   int   cin   ret   scanf   

原文地址:https://www.cnblogs.com/wangyiming/p/9281876.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!