矩阵快速幂模板

struct Mat
{
    int line;
    int column;
    int a[4][4];//注意!!!根据题目需要更改大小
    Mat()
    {
        line=column=2;//同上!!!这里是初始化为单位矩阵,但是在正式写代码时不建议用这个,用下面那个比较好
        a[1][1]=1;
        a[1][2]=0;
        a[2][1]=0;
        a[2][2]=1;
    }
    Mat(int x,int y)
    {
        line=x;
        column=y;
        memset(a,0,sizeof(a));
    }
};
Mat MulMat(Mat A,Mat B,int MOD)//A's column and B's line must be equal
{
    int aa,bb,cc;
    aa=A.line;
    bb=A.column;
    cc=B.column;
    Mat C(aa,cc);
    for(int i=1;i<=aa;i++)
    {
        for(int j=1;j<=cc;j++)
        {
            for(int k=1;k<=bb;k++)
            {
                C.a[i][j]+=(A.a[i][k]*B.a[k][j])%MOD;
                C.a[i][j]%=MOD;
            }
        }
    }
    return C;
}
Mat FastMod(Mat A,int n,int Mod)
{
    Mat E;
    if(n==0)
        return E;
    if(n==1)
        return A;
    if(n%2==1)
    {
        //printf("step1\n");
        return(MulMat(A,FastMod(A,n-1,Mod),Mod));
    }
    else
    {
        Mat temp=FastMod(A,n/2,Mod);
        //printf("step 2\n");
        return(MulMat(temp,temp,Mod));
    }
}

漏了一个运算符重载,补上。。。

Mat operator *(const Mat& A,const Mat& B)
{
    return(MulMat(A,B,m));
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值