今天看看数论方面的事情。
快速幂 a^b mod c
递推式
分两种情况,一个是b为奇数,另一个是b为非0偶数,弹出条件为b==0。
int power(int a,int b,int p)
{
if(b==0) return 1%p;//最好写上%p,更加严谨。
int c=power(a,b/2,p);
c=c*c%p;
if(b&1) c=c*a%p;
return c;
}
循环式
一般我个人比较推荐循环式
时间复杂度:O(logN)
int power(int a,int b,int p)
{
int ret=1%p;
while(b)
{
if(b&1)
ret=ret*a%p;
b>>=1;
a=a*a%p;
}
return ret;
}
数据范围(10^18)
慢速乘
和快速幂相似,只不过是把乘法转换成了加法。
int mul(int a,int b,int p)
{
int ret=0;
while(b)
{
if(b&1)
ret=(ret+a)%p;
b>>=1;
a=(a+a)%p;
}
return ret;
}