#include <iostream> #include <stdio.h> #include <cstring> using namespace std; int tmp[21][21],ans[21][21],b[21][21]; int N; void mul(int a[][21],int b[][21]) { memset(tmp,0,sizeof(tmp)); for(int i=1; i<=N; i++) for(int j=1; j<=N; j++) for(int k=1; k<=N; k++) { tmp[i][j]+=a[i][k]*b[k][j]; if(tmp[i][j]>=1000) tmp[i][j]%=1000; } memcpy(a,tmp,sizeof(tmp)); } void pow(int a[][21],int b[][21],int k) { memset(a,0,sizeof(a)); for(int i=1; i<=N; i++) a[i][i]=1; while(k) { if(k&1) mul(a,b); mul(b,b); k>>=1; } } int main() { int m,k,T,s,t; int temp[21][21]; while(scanf("%d%d",&N,&m)==2) { if(N==0&&m==0) break; memset(b,0,sizeof(b)); memset(temp,0,sizeof(temp)); while(m--) { scanf("%d%d",&s,&t); b[++s][++t]=1; temp[s][t]=1; } scanf("%d",&T); while(T--) { memset(ans,0,sizeof(ans)); scanf("%d%d%d",&s,&t,&k); memcpy(b,temp,sizeof(temp)); pow(ans,b,k); printf("%d\n",ans[++s][++t]%1000); } } return 0; }
How many ways?? hdu 2157
最新推荐文章于 2020-09-22 08:26:32 发布