社区讨论
分治做法RE求条
P10502Matrix Power Series参与者 3已保存回复 4
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 4 条
- 当前快照
- 1 份
- 快照标识符
- @mk16l0xz
- 此快照首次捕获于
- 2026/01/05 21:13 上个月
- 此快照最后确认于
- 2026/01/09 13:50 上个月
CPP
#include<bits/stdc++.h>
using namespace std;
#define ll long long
struct matrix{
ll n,m,mod;
ll a[30][30];
matrix(const ll &A=0,const ll &B=0,const ll &C=0){
n=A,m=B,mod=C;
memset(a,0,sizeof(a));
}
inline void resize(const ll &n,const ll &m,const ll &mod){
this->n=n,this->m=m,this->mod=mod;
memset(this->a,0,sizeof(this->a));
return;
}
inline void unit(const ll &n,const ll &mod){
resize(n,n,mod);
for(ll i=0;i<n;i++) this->a[i][i]=1;
return;
}
inline matrix operator+(const matrix &oth)const{
matrix res(this->n,this->m,mod);
for(ll i=0;i<res.n;i++) for(ll j=0;j<res.m;j++) res.a[i][j]=(this->a[i][j]+oth.a[i][j])%mod;
return res;
}
inline matrix &operator+=(const matrix &oth){return *this=*this+oth;}
inline matrix operator*(const matrix &oth)const{
matrix res(this->n,oth.m,mod);
for(ll i=0;i<res.n;i++) for(ll j=0;j<res.m;j++) for(ll k=0;k<this->m;k++) res.a[i][j]=(res.a[i][j]+this->a[i][k]*oth.a[k][j]%mod)%mod;
return res;
}
inline matrix &operator*=(const matrix &oth){return *this=*this*oth;}
inline matrix qpow(ll b){
matrix res,a=*this;
res.unit(this->n,mod);
while(b){
if(b&1) res*=a;
a*=a;
b>>=1;
}
return res;
}
};
ll n,m,k;
matrix a,ans;
inline matrix calc(const ll &n){
if(n<=0) return matrix(n,n,m);
if(n==1) return a;
matrix u,res;
u.unit(n,m);
res=(a.qpow(n>>1)+u)*calc(n>>1);
if(n&1) res+=a.qpow(n);
return res;
}
int main(){
cin>>n>>k>>m;
a.resize(n,n,m);
for(ll i=0;i<n;i++) for(ll j=0;j<n;j++) cin>>a.a[i][j];
ans=calc(k);
for(ll i=0;i<n;i++){
for(ll j=0;j<n;j++) cout<<ans.a[i][j]<<' ';
cout<<'\n';
}
return 0;
}
回复
共 4 条回复,欢迎继续交流。
正在加载回复...