春天到了, HDU校园里开满了花, 姹紫嫣红, 非常美丽. 葱头是个爱花的人, 看着校花校草竞相开放, 漫步校园, 心情也变得舒畅. 为了多看看这迷人的校园, 葱头决定, 每次上课都走不同的路线去教室, 但是由于时间问题, 每次只能经过k个地方, 比方说, 这次葱头决定经过2个地方, 那他可以先去问鼎广场看看喷泉, 再去教室, 也可以先到体育场跑几圈, 再到教室. 他非常想知道, 从A 点恰好经过k个点到达B点的方案数, 当然这个数有可能非常大, 所以你只要输出它模上1000的余数就可以了. 你能帮帮他么?? 你可决定了葱头一天能看多少校花哦
接下来的T行, 每行有三个整数 A, B, k, 表示问你从A 点到 B点恰好经过k个点的方案数 (k < 20), 可以走重复边。如果不存在这样的走法, 则输出0
当n, m都为0的时候输入结束
4 4 0 1 0 2 1 3 2 3 2 0 3 2 0 3 3 3 6 0 1 1 0 0 2 2 0 1 2 2 1 2 1 2 1 0 1 3 0 0
2 0 13
//china no.1 #include <vector> #include <iostream> #include <string> #include <map> #include <stack> #include <cstring> #include <queue> #include <list> #include <stdio.h> #include <set> #include <algorithm> #include <cstdlib> #include <cmath> #include <iomanip> #include <cctype> #include <sstream> #include <functional> using namespace std; #define pi acos(-1) #define endl '\n' #define rand() srand(time(0)); #define me(x) memset(x,0,sizeof(x)); #define foreach(it,a) for(__typeof((a).begin()) it=(a).begin();it!=(a).end();it++) #define close() ios::sync_with_stdio(0); cin.tie(0); typedef long long LL; const int INF=0x3f3f3f3f; const LL LINF=0x3f3f3f3f3f3f3f3fLL; const int dx[]={-1,0,1,0,-1,-1,1,1}; const int dy[]={0,1,0,-1,1,-1,1,-1}; const int maxn=1e3+5; const int maxx=1e5+100; const double EPS=1e-7; const int MOD=10000007; #define mod(x) ((x)%MOD); template<class T>inline T min(T a,T b,T c) { return min(min(a,b),c);} template<class T>inline T max(T a,T b,T c) { return max(max(a,b),c);} template<class T>inline T min(T a,T b,T c,T d) { return min(min(a,b),min(c,d));} template<class T>inline T max(T a,T b,T c,T d) { return max(max(a,b),max(c,d));} //typedef tree<pt,null_type,less< pt >,rb_tree_tag,tree_order_statistics_node_update> rbtree; long long gcd(long long a , long long b){if(b==0) return a;a%=b;return gcd(b,a);} #define FOR(x,n,i) for(int i=x;i<=n;i++) #define FOr(x,n,i) for(int i=x;i<n;i++) #define W while inline int Scan() { int res=0,ch,flag=0; if((ch=getchar())=='-')flag=1; else if(ch>='0' && ch<='9')res=ch-'0'; while((ch=getchar())>='0'&&ch<='9')res=res*10+ch-'0'; return flag ? -res : res; } int a[maxx],bb[maxx],c[maxx],n,k,mod=1e3,t; int ssize = 25,x,y,tt,mapp[35][35]; struct Matrix { LL m[35][35]; void init(){ memset(m, 0, sizeof m); } /*void setOne() { init(); for(int i=1;i<=ssize;i++) m[i][i]=1; } void unit() { m[1][10]=m[1][34] = 1; for(int i=1;i<=33;i++) m[i+1][i] = 1; } void print() { for(int i=1;i<=ssize;i++) { for(int j=1;j<=ssize;j++) cout << m[i][j] << " "; cout << endl; } cout << endl; }*/ } I,A,B,T,b,res; Matrix Mul(Matrix a,Matrix b) // { int i,j,k; Matrix c; for(int i=0;i<n;i++) { for(int j=0;j<n;j++) { c.m[i][j]=0; for(int k=0;k<n;k++) { c.m[i][j]+=(a.m[i][k]*b.m[k][j]); c.m[i][j]%=mod; } } } return c; } void quickPow(int x) { while(x) { if(x&1) res=Mul(res,A); x>>=1; A=Mul(A,A); } } void init() { for(int i=0;i<n;i++) { for(int j=0;j<n;j++) { A.m[i][j]=mapp[i][j]; res.m[i][j]=(i==j); } } } int main() { while(scanf("%d%d",&n,&tt)!=EOF) { if(n==0&&tt==0) return 0; me(mapp); for(int i=0;i<tt;i++) { int u,v; scanf("%d%d",&u,&v); mapp[u][v]=1; } scanf("%d",&t); while(t--) { int a,b,k; init(); scanf("%d%d%d",&a,&b,&k); quickPow(k); printf("%d\n",res.m[a][b]%1000); } } return 0; }