目录
一、快速幂
用法:求a的p次幂%mod
- 源代码1
int fast_pow(int a,int p)//快速幂求法
{
int res=1;
while(p){
if(p%2==0){
a=a*1ll*a%mod;
p=p/2;
}else{
res=res*1ll*a%mod;
--p;
}
}
return res;
}
- 源代码2:
int fast(int a,int b,int mod){ int res=1%mod; while(b){ //b&1为true说明二进制下的b的第0位为1,即b为奇数,返回false则b为偶数 if(b&1) res=(ll)res*a%mod; a=(ll)a*a%mod; b>>=1;//二进制数下的b右移一位等于b/2 } return res; }
- 理解:
/* 当指数为偶数时,a=a*a,指数p/2;
eg:求5^10,a=5,p=10;
第一次循环,a=25,p=5.显然是正确的,5^10=25^5;
第二次循环,因为p等于5,不能倍缩了,所以得乘掉一个a,让它继续满足倍缩条件
此时res=25,a=25,p=4
依次循环循环直到p=1时,得到结果,res=1*5^10=1*25^5=1*25*25^4=1*25*625^2=1*25*390625
*/
二、一些知识
1、a*b%c = (a%c)*(b%c)
2、a^b%p = (a%p)^b%p
3、费马小定理:对于a和素数p,满足a^(p-1)%p ≡ 1。(a*a^(p-2)%p ≡ 1,a的逆元为a^(p-2))
4、逆元:对于b和p(b和p互素),若a*b%p ≡ 1,则称a为b%p的逆元)。
4、a/b%p=a*(b^(p-2))%p(a与p互质))(由费马小定理和逆元定义可得,b的逆元为b^(p-2),分式同乘它即可得到后面那个式子,将除法的余数改成乘法的余数)
5、p>>=1等价于p/=2;//>>a位运算符表示将p二进制数下的位数整体向右移a位,p为正数则左补0,负数左补1,右边多余的舍弃。