【快速幂】
快速幂用于高效求(a^b) mod n 的结果。考虑到分治思想,当b为偶数时,我们可以把a^b转化为a^(b/2)*a^(b/2),当b为奇数时,我们可以把a^b转化为a^(b/2)*a^(b/2)*a。不断分解,最终b会变成1,并且只需要logb次就可以把b变成1。
【代码实现】
int quick_pow(int a,int b,int n) //递归
{
if(b==1) return a;
int t=quick_pow(a,b/2,n);
t=t*t%n;
if(b%2)
t=t*a%n;
return t;
}
int quick_pow(int a,int b,int n) //非递归
{
int ret=1;
while(b)
{
if(b%2) ret=ret*a%n;
a=a*a%n;
b=b/2;
}
return ret;
}
【矩阵快速幂】
矩阵乘法:
const int N=100;
int c[N][N];
void multi(int a[][N],int b[][N],int n) //n是矩阵大小
{
memset(c,0,sizeof(c));
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
for(int k=1;k<=n;k++)
c[i][j]+=a[i][k]*b[k][j];
}
【代码实现】
const int N=100;
int tmp[N][N];
void multi(int a[][N],int b[][N],int n)
{
int i,j,k;
memset(tmp,0,sizeof tmp);
for(i=0;i<n;i++)
for(j=0;j<n;j++)
for(k=0;k<n;k++)
tmp[i][j]+=a[i][k]*b[k][j];
for(i=0;i<n;i++)
for(j=0;j<n;j++)
a[i][j]=tmp[i][j];
}
int res[N][N];
void Pow(int a[][N],int n)
{
memset(res,0,sizeof res); //n是幂,N是矩阵大小
for(int i=0;i<N;i++)
res[i][i]=1;
while(n)
{
if(n&1)
multi(res,a,N); //res=res*a;
multi(a,a,N); //a=a*a
n>>=1;
}
}