【模板】矩阵运算

I spent much time on matrix caculating, and I wanna share a module of matrix caculating with you.

I hope you can enjoy it.

Just tell me if any incorrects.

struct mtx {
    #define RP(t,a,b) for(ll t=(a),edd=(b);t<=edd;t++)
    #define ll long long
    ll data[101][101];
    inline ll qr(void){
        char c=getchar();
        ll x=0,q=1;
        while(c<48||c>57)
            q=c=='-'?-1:q,c=getchar();
        while(c>=48&&c<=57)
            x=(x<<1)+(x<<3)+(c^48),c=getchar();
        return q*x;
    }
    mtx() {
        memset(data,0,sizeof data);
    }
    mtx operator *(const mtx& x) {
        mtx temp;
        RP(t,0,n-1)
        RP(i,0,n-1)
        RP(k,0,n-1)
        temp.data[t][i]=(temp.data[t][i]+(data[t][k]*x.data[k][i])%mod)%mod;
        return temp;
    }
    mtx operator *(const ll& x){
        mtx temp;
        RP(t,0,n-1)
        RP(i,0,n-1)
            temp.data[t][i]=data[t][i]*x;
        return temp;
    }
    mtx operator *=(const mtx& x) {
        return (*this)=(*this)*x;
    }
    mtx operator *=(const ll&x ){
        return (*this)=(*this)*x;
    }
    mtx operator ^(const ll& p) {
        ll b=p;
        mtx ans,base;
        ans.unis();
        base=(*this);
        while(b) {
            if(b&1)
                ans*=base;
            base*=base;
            b>>=1;
        }
        return ans;
    }
    mtx operator ^=(const ll& p) {
        return (*this)=(*this)^p;
    }
    void unis() {
        for(ll t=0; t<n; t++)
            data[t][t] = 1;
    }
    void print() {
        for(ll t=0; t<n; t++) {
            for(ll ti=0; ti<n; ti++)
                cout<<data[t][ti]<<' ';
            cout<<"\n";
        }
        return;
    }
    void scan(void){
        RP(t,0,n-1)
        RP(ti,0,n-1)
        data[t][ti]=qr();
    }
};

转载于:https://www.cnblogs.com/winlere/p/10308063.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值