快速幂运算+快速幂求乘法逆元
Posted 一只特立独行的猫
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了快速幂运算+快速幂求乘法逆元相关的知识,希望对你有一定的参考价值。
快速幂运算
时间复杂度:
O(logp)
原理:
当计算
a
b
m
o
d
p
a^bmod\\ p
abmod p时,可以将多次累乘转换为少次累乘。如:
a
(
10
)
10
m
o
d
p
=
a
(
1010
)
2
m
o
d
p
=
a
(
1000
)
2
∗
a
(
10
)
2
m
o
d
p
a^{(10)_{10}}mod\\ p = a^{(1010)_2}mod\\ p = a^{(1000)_2}*a^{(10)_2}mod \\ p
a(10)10mod p=a(1010)2mod p=a(1000)2∗a(10)2mod p
通过这种计算方法,就将乘的次数由b降到了logb
代码:
当计算
(
1
0
9
)
1
0
9
m
o
d
1
0
9
+
7
(10^9)^{10^9}mod\\ 10^9+7
(109)109mod 109+7的结果时, 只能用快速幂求解才能较快的 计算出结果,且不会在计算的途中溢出。
#include<iostream>
typedef long long LL;
using namespace std;
int qmi(int a,int b,int p){
int res=1;
while(b!=0){
//提取二进制位为1才是有效位
if(b&1) res = (LL)res*a%p;
b>>=1;
a=(LL)a*a%p;
}
return res;
}
int main(){
int n;
cin>>n;
while(n--){
int a,b,p;
scanf("%d%d%d",&a,&b,&p);
printf("%d\\n",qmi(a,b,p));
}
return 0;
}
快速幂运算求乘法逆元
乘法逆元的定义:
如
果
存
在
b
满
足
a
∗
b
三
1
(
m
o
d
n
)
如果存在b满足a*b \\ 三 \\ 1\\ (mod\\ n)
如果存在b满足a∗b 三 1 (mod n),则称b为a模n的乘法逆元,记为
a
−
1
a^{-1}
a−1
前提:
a和n互质
思路:
由费马定理
a
n
−
1
三
1
(
m
o
d
n
)
a^{n-1}三 \\ 1\\ (mod\\ n)
an−1三 1 (mod n)可知,
a
−
1
a^{-1}
a−1即为
a
n
−
2
m
o
d
n
a^{n-2} mod \\ n
an−2mod n,所以就将题目转换为了快速求
a
n
−
2
m
o
d
n
的
问
题
。
a^{n-2}mod\\ n的问题。
an−2mod n的问题。
代码:
#include<iostream>
using namespace std;
typedef long long LL;
//a^k%p
int qmi(int a,int k,int p){
int res = 1;
while(k){
if(k&1) res=(LL)res*a%p;
k>>=1;
a=(LL)a*a%p;
}
return res;
}
int main(){
int n;
cin>>n;
while(n--){
int a,p;
scanf("%d%d",&a,&p);
//题目满足p是质数,所以只有a是p的倍数的情况下不互质,即无解
if(a%p==0) printf("impossible\\n");
else printf("%d\\n",qmi(a,p-2,p));
}
return 0;
}
以上是关于快速幂运算+快速幂求乘法逆元的主要内容,如果未能解决你的问题,请参考以下文章
Codeforces718 C. Sasha and Array(线段树维护矩阵,矩阵快速幂求斐波那契数列,矩阵乘法结合律)