目录
【快速幂】
快速幂用于高效求(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次运算。
【代码实现】
//两种写法
int quick_pow(int a,int b,int mod) //递归
{
if(b==1) return a;
int t=quick_pow(a,b/2,mod);
t=t*t%mod;
if(b&1)
t=t*a%mod;
return t;
}
int quick_pow(int a,int b,int mod) //非递归
{
int ret=1;
while(b)
{
if(b&1) ret=ret*a%mod;
a=a*a%mod;
b=b/2;
}
return ret;
}
【应用】
不再赘述,就是高效求(a^b) mod n 的结果。
【矩阵快速幂】
预备知识:矩阵乘法
【矩阵乘法】
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);