快速幂和矩阵快速幂
快速幂
快速幂主要运用了分治的思想
具体推理过程可以看洛谷的题解思路 https://www.luogu.com.cn/problem/solution/P1226
代码模板如下
int quickPower(int a, int b)//是求a的b次方
{
int ans = 1, base = a;//ans为答案,base为a^(2^n)
while(b > 0)//b是一个变化的二进制数,如果还没有用完
{
if(b & 1)//&是位运算,b&1表示b在二进制下最后一位是不是1,如果是:
ans *= base;//把ans乘上对应的a^(2^n)
base *= base;//base自乘,由a^(2^n)变成a^(2^(n+1))
b >>= 1;
}
return ans;
}
以及快速幂模
int pow_mod(int a,int b,int c){//求a的b次方模c的结果
int ans = 1;
int base = a%c;
while(b){
if(b & 1) ans = (ans*base)%c;
base = (base*base)%c;
b >>= 1;
}
return ans;
}
矩阵快速幂
而掌握了快速幂的代码 实现矩阵快速幂也十分简单 只需要用一个结构体实现矩阵的逻辑 并重载乘法符号 套用上面的模板就好
结构体实现矩阵
struct ahaha{
ll a[maxn][maxn]; //一般用long long 数据
ahaha(){
memset(a,0,sizeof a);
}
inline void build(){ //构建单位矩阵
for(int i=1;i<=n;++i)a[i][i]=1;
}
}a;
运算符重载
ahaha operator *(const ahaha &x,const ahaha &y){
ahaha z;
for(int k=1;k<=n;++k)
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j)
z.a[i][j]=(z.a[i][j]+x.a[i][k]*y.a[k][j]%mo)%mo;
return z;
}
然后就可以套用快速幂公式来实现矩阵快速幂(ans,base需要是结构体定义的矩阵)
例题
洛谷P3390
洛谷P1939