矩阵快速幂模板

来源:互联网 发布:mac怎么格式化存储卡 编辑:程序博客网 时间:2024/05/22 04:31

先实现一次矩阵相乘O(N^3)

代码:

struct Mat{    int mat[N][N];};Mat Multiply(Mat a, Mat b){    Mat c;    memset(c.mat, 0, sizeof(c.mat));    for(int k = 0; k < n; ++k)        for(int i = 0; i < n; ++i)            if(a.mat[i][k])                for(int j = 0; j < n; ++j)                    if(b.mat[k][j])                        c.mat[i][j] = (c.mat[i][j] +a.mat[i][k] * b.mat[k][j])%Mod;    return c;}

矩阵快速幂(mat^k),如何减少乘法运算:比如mat^11需要11次乘法,11(10)=1011(2) , 所以:mat^11=mat^8*mat^2*mat^1. 循环运算表达式mat=mat*mat, 得到mat的1,2,4,8,16……2^n次方,对应的二进制位数为1的累乘起来就行了。

Mat QuickPower(Mat a, int k){    Mat c;    memset(c.mat,0,sizeof(c.mat));    for(int i = 0; i < n; ++i)        c.mat[i][i]=1;    for(; k; k >>= 1)    {        if(k&1) c = Multiply(c,a);        a = Multiply(a,a);    }    return c;}

附:
快速幂模板,下面是计算(a^n)%k的一个模板。

int quickpow(int a,int n,int k){    int b = 1;    while (n)    {          if (n & 1)             b = (b*a)%k;          n = n >> 1 ;          a = (a*a)%k;    }    return b;}
0 0
原创粉丝点击