• 【模板】矩阵运算


    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<<"
    ";
    		}
    		return;
    	}
    	void scan(void){
    		RP(t,0,n-1)
    		RP(ti,0,n-1)
    		data[t][ti]=qr();
    	}
    };
    
  • 相关阅读:
    MongoDB学习(1)—在Windows系统中安装MongoDB
    在windows系统的文件右键菜单中增加“命令提示符”
    python基础五之字典
    python基础四之列表
    python基础三之字符串
    python基础二
    python基础一
    二叉搜索树与双向链表
    记录一下Comparator的用法
    根节点到叶子节点路径之和为target
  • 原文地址:https://www.cnblogs.com/winlere/p/10308063.html
Copyright © 2020-2023  润新知