dp1[i][j]表示只走x轴走j步到i位置有多少总走法,dp2同,dp方程就很好写
wa了无数发,发现MOD写在INF上了
1 #include<cstdio> 2 #include<iostream> 3 #include<algorithm> 4 #include<cstring> 5 #include<cmath> 6 #include<queue> 7 #include<map> 8 using namespace std; 9 #define MOD 9999991 10 const int INF=9999991; 11 const double eps=1e-5; 12 typedef long long ll; 13 #define cl(a) memset(a,0,sizeof(a)) 14 #define ts printf("***** "); 15 const int MAXN=2050; 16 int n,m,tt; 17 int x,y,k; 18 int c[1050][1050]; 19 int sum1[1050],sum2[1050]; 20 int dp1[MAXN][1050],dp2[MAXN][1050]; 21 void add(int &a,int b) 22 { 23 a=(a+b)%MOD; 24 } 25 void fun() 26 { 27 cl(dp1),cl(dp2); 28 c[0][0]=c[1][0]=c[1][1]=1; 29 for(int i=2;i<=1010;i++) 30 { 31 c[i][0]=1; 32 for(int j=1;j<i;j++) 33 { 34 c[i][j]=c[i-1][j]+c[i-1][j-1]; 35 c[i][j]%=MOD; 36 } 37 c[i][i]=1; 38 } 39 dp1[x][0]=1; 40 for(int i=1;i<=k;i++) 41 { 42 for(int j=1;j<=n;j++) 43 { 44 if(j+1<=n) add(dp1[j][i],dp1[j+1][i-1]); 45 if(j+2<=n) add(dp1[j][i],dp1[j+2][i-1]); 46 if(j-1>=1) add(dp1[j][i],dp1[j-1][i-1]); 47 if(j-2>=1) add(dp1[j][i],dp1[j-2][i-1]); 48 } 49 } 50 dp2[y][0]=1; 51 for(int i=1;i<=k;i++) 52 { 53 for(int j=1;j<=m;j++) 54 { 55 if(j+1<=m) add(dp2[j][i],dp2[j+1][i-1]); 56 if(j+2<=m) add(dp2[j][i],dp2[j+2][i-1]); 57 if(j-1>=1) add(dp2[j][i],dp2[j-1][i-1]); 58 if(j-2>=1) add(dp2[j][i],dp2[j-2][i-1]); 59 } 60 } 61 cl(sum1),cl(sum2); 62 for(int i=0;i<=k;i++) 63 { 64 for(int j=1;j<=n;j++) 65 { 66 add(sum1[i],dp1[j][i]); 67 } 68 } 69 for(int i=0;i<=k;i++) 70 { 71 for(int j=1;j<=m;j++) 72 { 73 add(sum2[i],dp2[j][i]); 74 } 75 } 76 } 77 int main() 78 { 79 int i,j; 80 #ifndef ONLINE_JUDGE 81 freopen("1.in","r",stdin); 82 #endif 83 int ca=1; 84 scanf("%d",&tt); 85 while(tt--) 86 { 87 scanf("%d%d%d%d%d",&n,&m,&k,&x,&y); 88 fun(); 89 printf("Case #%d: ",ca++); 90 ll sum=0; 91 for(i=0;i<=k;i++) 92 { 93 sum += (long long)c[k][i]*sum1[i]%MOD*sum2[k-i]%MOD; 94 sum %= MOD; 95 } 96 printf("%d ",(int)sum); 97 } 98 }