快速幂模板
Posted JunMain
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了快速幂模板相关的知识,希望对你有一定的参考价值。
快速幂
题目描述
给定 n 组 a i , b i , p i a_i,b_i,p_i ai,bi,pi,对于每组数据,求出 a i b i a_i^b_i aibi % p i p_i pi 的值。
输入格式
第一行包含整数 n。
接下来 n 行,每行包含三个整数 a i , b i , p i a_i,b_i,p_i ai,bi,pi。
输出格式
对于每组数据,输出一个结果,表示 a i b i a_i^b_i aibi % p i p_i pi 的值。
每个结果占一行。
数据范围
1
≤
n
≤
100000
,
1≤n≤100000,
1≤n≤100000,
1
≤
a
i
,
b
i
,
p
i
≤
2
×
1
0
9
1 ≤ a_i,b_i,p_i≤2×10^9
1≤ai,bi,pi≤2×109
输入样例:
2
3 2 5
4 3 9
输出样例:
4
1
题解:
a b a^b ab中 b b b 可以写出二进制形式
例如:
5
5
5=
(
101
)
2
(101)_2
(101)2 =
2
0
+
2
2
2^0 + 2^2
20+22
a
5
=
a
2
0
+
2
2
=
a
2
0
∗
a
2
2
=
a
1
∗
a
4
a^5 = a^2^0 + 2^2 = a^2^0 * a^2^2 = a^1 * a^4
a5=a20+22=a20∗a22=a1∗a4
7
=
(
111
)
2
7 = (111)_2
7=(111)2
a
7
a^7
a7 =
a
2
0
+
2
1
+
2
2
=
a
2
0
∗
a
2
1
∗
a
2
2
=
a
1
∗
a
2
∗
a
4
a^2^0 + 2^1 + 2^2 = a^2^0 * a^2^1 * a^2^2 = a^1 * a ^2 * a^4
a20+21+22=a20∗a21∗a22=a1∗a2∗a4
实际上 a b a^b ab 可以通过 a 1 , a 2 , a 4 , ⋅ ⋅ ⋅ , a k a^1, a^2, a^4, ···,a^k a1,a2,a4,⋅⋅⋅,ak 相乘组成(根据二进制每一个选或者不选 )
取余的性质:
(a * b) % p = (a % p * b % p) % p
(a + b) % p = (a % p + b % p) % p
代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
LL qmi(int a, int b, int p)
LL ans = 1;
while (b)
if (b & 1) ans = ans * a % p;
b >>= 1;
a = a * (LL)a % p;
return ans;
int main()
int n;
cin >> n;
while (n -- )
int a, b, p;
scanf("%d%d%d", &a, &b, &p);
printf("%lld\\n", qmi(a,b,p));
return 0;
以上是关于快速幂模板的主要内容,如果未能解决你的问题,请参考以下文章