1. 程式人生 > 實用技巧 >C語言例項-能組成多少個三位數?

C語言例項-能組成多少個三位數?

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;
    } 

完了之後可以試著用這種方法去解決一下斐波那契數列超時問題