#include<iostream> #include<map> using namespace std; #define N 31 #define FF(i,n) for(int i=0;i<n;i++) #define mod 2008 int len; struct Matrix_Cal{ int mat[N][N]; }e,init,tp1,tp2; Matrix_Cal operator+(Matrix_Cal a ,Matrix_Cal b){ Matrix_Cal c; FF(i,len)FF(j,len) c.mat[i][j]=a.mat[i][j]+b.mat[i][j]; return c; } Matrix_Cal operator*(Matrix_Cal a , Matrix_Cal b){ Matrix_Cal c; int i,j,k; FF(i,len)FF(j,len) c.mat[i][j] = 0; FF(i,len)FF(k,len) if(a.mat[i][k])FF(j,len) if(b.mat[k][j]) c.mat[i][j]=(c.mat[i][j]+a.mat[i][k]*b.mat[k][j])%mod; return c; } Matrix_Cal operator^(Matrix_Cal a , int b){ Matrix_Cal c=e, q=a; for(;b;b>>=1){ if(b&1) c=c*q; q=q*q; } return c; } Matrix_Cal Matrix_Sum(Matrix_Cal a,int b){ if(b==1) return a; if(b&1) return Matrix_Sum(a,b-1)+(a^b); else return ((a^(b>>1))+e)*Matrix_Sum(a,b>>1); } int main(void){ int t; int i,j; while(~scanf("%d",&t)){ FF(i,N)FF(j,N){ e.mat[i][j]=(i==j); init.mat[i][j]=0; } map<int,int> M; len=1; while(t--){ int a,b; scanf("%d%d",&a,&b); if(!M[a]) M[a]=len++; if(!M[b]) M[b]=len++; init.mat[M[a]-1][M[b]-1]++; } len--; scanf("%d",&t); while(t--){ int v1,v2,t1,t2; scanf("%d%d%d%d",&v1,&v2,&t1,&t2); if(!M[v1]||!M[v2]||(t1==0&&t2==0)){ printf("0/n"); continue; } int ret; if(t1>1){ tp1=Matrix_Sum(init,t2); tp2=Matrix_Sum(init,t1-1); ret=(tp1.mat[M[v1]-1][M[v2]-1]%mod-tp2.mat[M[v1]-1][M[v2]-1]%mod)%mod; } else{ tp1=Matrix_Sum(init,t2); ret=tp1.mat[M[v1]-1][M[v2]-1]%mod; } if(ret<0) ret+=mod; printf("%d/n",ret); } } }