普通快速幂
对于a的n次幂
int power(int a, int n)//a^n
{
int ans = 1;
while(n > 0)
{
if(n&1) //当n为奇数时,乘以余下的一个a
ans *= a;
a=a*a;
n>>=1;
}
return ans;
}
如果对于a的n次幂较大,涉及取模运算
int power(int a, int n,int mod)//a^n
{
int ans = 1;
int t=a%mod;
while(n > 0)
{
if(n&1) //当n为奇数时,乘以余下的一个a
ans=ans*t%mod;
t=t*t%mod;
n>>=1;//右移一位
}
return ans;
}
对于矩阵的快速幂,原理与普通快速幂相同
const int N=10;
int n,mod;
int temp[N][N];
int res[N][N],a[N][N];
void mul(int a[][N],int b[][N])//矩阵乘法,如果给出两个矩阵
{
memset(temp,0,sizeof(temp));
for(int i=0;i<N;i++)
for(int j=0;j<N;j++)
for(int k=0;k<N;k++)
temp[i][j]=(temp[i][j]+a[i][k]*b[k][j]%mod)%mod;//数据太大则会涉及取模运算
for(int i=0;i<N;i++)
for(int j=0;j<N;j++)
a[i][j]=temp[i][j];
return ;
}
void fun(int nn)//快速幂,只不过底数换成了矩阵
{
memset(res,0,sizeof(res));
for(int i=0;i<N;i++)
res[i][i]=1;//单位阵
while(nn){
if(nn&1)//奇数的话res×a
mul(res,a);
mul(a,a);//a自己平方
nn>>=1;//幂次/2
}
return ;
}
参考样题 poj 3070 代码 https://www.cnblogs.com/yuyixingkong/p/4335840.html;