快速冪和矩陣快速冪
阿新 • • 發佈:2020-08-18
快速冪
快速冪主要運用了分治的思想
程式碼模板如下
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