例题:
输入 b
,p
,k
的值,求 b
^p
mod k
的值。其中 b
,p
,k
为长整型数。
- 快速幂
假设p
=22
,那么p
可以用16
+4
+2
表示,即 $2^4+2^2+2^1$ 表示
上代码(没求模):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| using ll = long long;
ll pow_mod(ll b, ll p) { ll res = 1; while (p > 0) { if (p & 1) { res = (res * b); } b = (b * b); p >>= 1; } return res ; }
|
- 模运算
$$
(A+B) \mod b=(A \mod b+B \mod b) \mod b
$$
$$
(A×B) \mod b =((A \mod b)×(B \mod b)) \mod b
$$
所以上面那题的可以写出来了
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| #include <stdio.h>
using ll = long long;
ll pow_mod(ll b, ll p, ll k) { ll res = 1; while (p > 0) { if (p & 1) { res = (res * b) % k; } b = (b * b) % k; p >>= 1; } return res % k; }
int main() { ll b, p, k; scanf("%lld%lld%lld", &b, &p, &k); ll res = pow_mod(b, p, k); printf("%lld^%lld mod %lld=%lld", b, p, k, res); return 0; }
|