1、二分快速幂
//用于计算a^b%c
long long power(long long a,long long b,long long c)
{
long long ans=1;
a%=c;
while(b>0)
{
if(b&1) ans=(ans*a)%c;
b>>=1;
a=(a*a)%c;
}
return ans;
}
2、快速乘法
//用于计算a*b%c,(b>0,c不超过long long 范围)
long long multi(long long a,long long b,long long c)
{
long long ans=0;
while(b)
{
if(b&1) ans=(ans+a)%c;
b>>=1;
a=(a+a)%c;
}
return ans;
}
//或
long long ksc(long long x,long long y,long long N)
{
long long a;
for(a=0;y;x=(x<<1)%N,y=(y>>1))
if(y&1)a=(a+x)%N;
return a;
}
/*
注:只用于long long运算
若为int类型(long long)a*b%c即可
*/
3、快速幂加快速乘法
long long quick_mod(long long a,long long b,long long c)
{
long long ans = 1;
a%=c;
while(b)
{
if(b&1)ans = multi(ans,a,m);
b>>=1;
a=multi(a,a,m);
}
return ans;
}
4、矩阵二分快速幂
typedef int int_[4][4];
int_ ans0,ans,a0,a,c;
void matrix_multi(int_ a,int_ b)
{
memset(c,0,sizeof(c));
for(int i=1;i<=3;i++)
for(int j=1;j<=3;j++)
for(int k=1;k<=3;k++)
c[i][j]=(((ll)a[i][k]*b[k][j])%p+c[i][j])%p;
memcpy(a,c,sizeof(c));
}
void matrix_power(int b)
{
memcpy(ans,ans0,sizeof(ans0));
while(b)
{
if(b&1) matrix_multi(ans,a);
b>>=1;
matrix_multi(a,a);
}
}