How many ways?? hdu 2157
#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;}