C語言例項-能組成多少個三位數?
阿新 • • 發佈:2020-11-01
0.矩陣的程式碼表示
struct node {
int mat[15][15];
}x,y;
1.矩陣乘法
矩陣乘法(就是線性代數裡學過那個)是對矩陣的一種基本運算,僅當矩陣A列數與矩陣B行數相等時AB才有意義。由A(m,n)B(n,p)可得到C(m,p);矩陣乘法滿足結合律與分配律,但不滿足交換律,因為比較簡單所以這裡就不詳細講了。
例題:
node mul(node x,node y){ node tmp; for(int i=0;i<len;i++){ for(int j=0;j<len;j++){ tmp.mat [i][j]=0; for(int k=0;k<len;k++){ tmp.mat [i][j]+=(x.mat [i][k]*y.mat [k][j])%mod; } tmp.mat [i][j]=tmp.mat[i][j]%mod; } } return tmp; }
注意:方陣也不滿足交換律
2.快速冪
比較簡單,話不多說直接上程式碼
int Pow(int a,int b){
int ans = 1;
int base = a;
while(b){
if(b & 1) ans *= base;
base *= base;
b >>= 1;
}
return ans;
}
需要取模:
#define mod 1000000007 int pow_mod(int a,int b){ int ans = 1; int base = a%mod; while(b){ if(b & 1) ans = (ans*base)%mod; base = (base*base)%mod; b >>= 1; } return ans; }
3.矩陣快速冪
矩陣快速冪就是用矩陣乘法來加速快速冪啦。實際上用方陣就好了。
node matpow(node x,node y,int num){
while(num){
if(num&1){
y=mul(y,x);
}
x=mul(x,x);
num=num>>1;
}
return y;
}
學廢完了之後可以試著用這種方法去解決一下斐波那契數列超時問題