(快速幂+位运算)
\(0\le a,b\le 10^9\\
0\leq p \leq 10^9\)
快速幂:
(1)取模运算法则
- (a + b) % p = (a % p + b % p) % p
- (a - b) % p = (a % p - b % p ) % p
- (a * b) % p = (a % p * b % p) % p
(2)快速幂可以在O(logk)内算出\(a^k\)mod p的值
先处理出:
\(a^{2^0} \ mod \ p\)
\(a^{2^1} \ mod \ p\)
\(a^{2^2} \ mod \ p\)
\(a^{2^3} \ mod \ p\)
\(a^{2^4} \ mod \ p\)
\(a^{2^{logk}} \mod \ p\)
只需要把k处理成二进制就可以了
那如何进行预处理呢?
\(a^{2^0}\\
{a^{2^1}}^2 = a^{2 ^ 2}\\
以此类推\)
全开LL避免溢出
#include<bits/stdc++.h>
typedef long long LL;
using namespace std;
LL a,b,p;
LL qmi(LL &a,LL &b, LL &q)
{
LL res = 1 % q;
while(b)
{
if(b & 1) res = res * a % q;
a = a * a % q;
b >>= 1;
}
return res;
}
int main()
{
cin >> a >> b >>p;
cout << qmi(a,b,p)<<endl;
return 0;
}
例:
求 a * b % p 的值
\(1\le a,b,p \le 10^{18}\)
Py自带高精度,所以虐杀
a = input()
b = input()
p = input()
print(a * b % p)
C++代码可以用位运算来做
可以参考上述快速幂的思想,a * b = a + a + a + a......+ a
a 2a 4a 8a 16a .....
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
LL res(LL &a, LL &b, LL &p)
{
LL res1 = 0;
while(b)
{
if(b & 1) res1 = (res1 + a) % p;
a = a * 2 % p;
b >>= 1;
}
return res1;
}
int main()
{
LL a, b ,p;
cin >> a >> b >> p;
cout << res(a, b, p)<<endl;
return 0;
}
标签:le,res,LL,res1,整数,long,乘法,快速,mod
From: https://www.cnblogs.com/lyz103/p/17360949.html