AcWing 875. 快速幂

题目链接:https://www.acwing.com/problem/content/description/877/


快速幂模板题,计算amod p 的值,a,b,p大概1e9左右,可以快速计算出结果

例如:11的二进制是1011,所以 11 = 23 * 1 + 22 * 0 + 21 * 1 + 20 * 1 = 20 + 21 + 23,当我们求 a11 的时候 a11 = a2^0 + 2^1 + 2^3 = a2^0 + a2^1 + a2^3,所以当我们计算任何ab 时,只要预处理出来 a2^0 ~ a2^logb 即可快速计算出结果

时间复杂度:O(logb)

 1 #include <iostream>
 2 #include <cstdio>
 3 
 4 using namespace std;
 5 typedef long long ll;
 6 int a, b, p, n;
 7 
 8 ll qmi()
 9 {
10     ll s = 1 % p;
11     while (b)
12     {
13         if (b & 1)  s = (ll)s * a % p;
14         a = (ll)a * a % p;
15         b >>= 1;
16     }
17     return s;
18 }
19 
20 int main()
21 {
22     scanf("%d",&n);
23     while (n -- )
24     {
25         scanf("%d%d%d",&a,&b,&p);
26         ll ans = qmi();
27         printf("%lld\n",ans);
28     }
29     return 0;
30 }
View Code

PS:对于代码中的第10行,写出 s = 1 % p,不写成 s = 1,是因为当p为1时结果不同(虽然p为1时不用计算,但是严谨许多)

 

posted @ 2019-12-09 10:25  chuyds  阅读(179)  评论(0编辑  收藏  举报