HDU 2157 How many ways??
矩阵快速幂。
#include<cstdio> #include<cmath> #include<cstring> #include<algorithm> using namespace std; const int maxn=25; const int MOD=1000; int x,y,s,t,m,n,k; struct node { int matrix[maxn][maxn]; node operator*(node b); } a,b,c; node node::operator*(node b) { node c; memset(c.matrix,0,sizeof(c.matrix)); int i,j,k; for(i=1; i<=n; i++) { for(j=1; j<=n; j++) { for(k=1; k<=n; k++) { c.matrix[i][j]=(c.matrix[i][j]+(matrix[i][k]*b.matrix[k][j])%MOD)%MOD; } } } return c; } int main() { while(~scanf("%d%d",&n,&m)) { if(m==0&&n==0) break; memset(a.matrix,0,sizeof(a.matrix)); memset(b.matrix,0,sizeof(b.matrix)); while(m--) { scanf("%d%d",&s,&t); s++; t++; b.matrix[s][t]=1; } int T; scanf("%d",&T); while(T--) { scanf("%d%d%d",&x,&y,&k); x++; y++; for(int i=1; i<=n; i++) { for(int j=1; j<=n; j++) { a.matrix[i][j]=b.matrix[i][j]; if(i==j) c.matrix[i][j]=1; else c.matrix[i][j]=0; } } while(k) { if(k%2) c=c*a,k--; else a=a*a,k/=2; } printf("%d\n",c.matrix[x][y]); } } return 0; }

浙公网安备 33010602011771号