矩阵快速幂

0.矩阵的代码表示
struct node { //本例为16*16的方阵
	int mat[15][15];
}x,y; 
1.矩阵乘法

矩阵乘法(就是线性代数里学过那个)是对矩阵的一种基本运算,仅当矩阵A列数与矩阵B行数相等时A*B才有意义。由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;
} 

学废了学完了之后可以试着用这种方法去解决一下斐波那契数列超时问题

posted @ 2020-11-02 12:09  一杯好凉茶  阅读(140)  评论(0编辑  收藏  举报