-
How many ways??
- HDU - 2157
- 离散定理:0-1邻接矩阵的k次方, u-v位置的数字就是 ,u通过k步到达v的方案数。
-
#include<bits/stdc++.h> using namespace std; #define maxn 23 #define mod 1000 int n,m,t,a,b,k; struct node { int x[maxn][maxn]; } mmp,ok,ans; node mup(node c,node d) { node ret; for(int i=0; i<n; i++) for(int j=0; j<n; j++) { ret.x[i][j]=0; for(int q=0; q<n; q++) ret.x[i][j]=(ret.x[i][j]+c.x[i][q]*d.x[q][j])%mod; } return ret; } void qpow() { memset(ans.x,0,sizeof(ans.x)); for(int i=0; i<n; i++) ans.x[i][i]=1; while(k) { if(k%2) ans=mup(ans,ok); ok=mup(ok,ok); k/=2; } } int main() { while(~scanf("%d%d",&n,&m)) { if(n==0&&m==0)break; memset(mmp.x,0,sizeof(mmp.x)); while(m--) { scanf("%d%d",&a,&b); mmp.x[a][b]=1; } scanf("%d",&t); while(t--) { memcpy(ok.x,mmp.x,sizeof(mmp.x)); scanf("%d%d%d",&a,&b,&k); qpow(); printf("%d\n",ans.x[a][b]); } } return 0; }