【hdu】【P2157】【How many ways??】【题解】【矩阵乘法】

来源:互联网 发布:1688怎么传淘宝 编辑:程序博客网 时间:2024/06/10 00:02

传送门: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;}


0 0
原创粉丝点击