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();
}
};