【hdu】【P2157】【How many ways??】【題解】【矩陣乘法】
阿新 • • 發佈:2019-01-25
傳送門:acm.hdu.edu.cn/showproblem.php?pid=2157
矩乘經典應用
Code:
#include<cstdio> #include<cstring> #include<iostream> using namespace std; const int maxn=21; const int MOD=1000; int n,m; struct Matrix{ int a[maxn][maxn]; void clear(){ memset(a,0,sizeof(a)); } void init(int n){ for(int i=0;i<n;i++)a[i][i]=1; } int at(int i,int j){ return a[i][j]; } void updata(int i,int j,int x){ a[i][j]=x; } Matrix operator*(Matrix x)const{ Matrix ans; ans.clear(); for(int i=0;i<n;i++) for(int j=0;j<n;j++) for(int k=0;k<n;k++) ans.a[i][j]+=a[i][k]*x.a[k][j], ans.a[i][j]%=MOD; return ans; } Matrix operator%(int p){ Matrix ans=*this; for(int i=0;i<n;i++) for(int j=0;j<n;j++) a[i][j]%=p; return ans; } }; Matrix pow(Matrix x,int k){ Matrix ans; ans.clear(); ans.init(n); for(;k;k>>=1){ if(k&1)ans=(ans*x)%MOD; x=(x*x)%MOD; }return ans; } Matrix mp; int main(){ while(scanf("%d%d",&n,&m)==2){ mp.clear(); if(!n&&!m)break; for(int i=1;i<=m;i++){ int u,v;scanf("%d%d",&u,&v); mp.updata(u,v,1); } int T;scanf("%d",&T); while(T--){ int u,v,k;scanf("%d%d%d",&u,&v,&k); Matrix ans=pow(mp,k); printf("%d\n",ans.at(u,v)%MOD); } } return 0; }