AcWing 875. 快速幂
题目链接:https://www.acwing.com/problem/content/description/877/
快速幂模板题,计算ab mod 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 }
PS:对于代码中的第10行,写出 s = 1 % p,不写成 s = 1,是因为当p为1时结果不同(虽然p为1时不用计算,但是严谨许多)