(快速幂+位运算)
0
≤
a
,
b
≤
1
0
9
0
≤
p
≤
1
0
9
0\le a,b\le 10^9\\ 0\leq p \leq 10^9
0≤a,b≤1090≤p≤109
快速幂:
(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
a^k
akmod p的值
先处理出:
a
2
0
m
o
d
p
a^{2^0} \ mod \ p
a20 mod p
a
2
1
m
o
d
p
a^{2^1} \ mod \ p
a21 mod p
a
2
2
m
o
d
p
a^{2^2} \ mod \ p
a22 mod p
a
2
3
m
o
d
p
a^{2^3} \ mod \ p
a23 mod p
a
2
4
m
o
d
p
a^{2^4} \ mod \ p
a24 mod p
a
2
l
o
g
k
m
o
d
p
a^{2^{logk}} \mod \ p
a2logkmod p
只需要把k处理成二进制就可以了
那如何进行预处理呢?
a
2
0
a
2
1
2
=
a
2
2
以此类推
a^{2^0}\\ {a^{2^1}}^2 = a^{2 ^ 2}\\ 以此类推
a20a212=a22以此类推
全开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
≤
a
,
b
,
p
≤
1
0
18
1\le a,b,p \le 10^{18}
1≤a,b,p≤1018
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;
}