【模板】矩阵运算

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();
	}
};
posted @ 2019-01-23 11:50  谁是鸽王  阅读(244)  评论(0编辑  收藏  举报