设$f[i][j]$为当前推到第$i$列,该列高度$h$,已经放了$j$个车的方案数
则$f[i][j]=f[i-1][j]+f[i-1][j-1]*(h-j+1)$
但是我们发现从左往右递推的话因为突然少掉一块,所以无法正常进行
那么从右往左就行了鸭!
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #define re register 5 using namespace std; 6 #define N 2002 7 const int mod=1e5+3; 8 int f[N][N],a,b,c,d,k; 9 int main(){ 10 scanf("%d%d%d%d%d",&a,&b,&c,&d,&k); 11 for(int i=0;i<=a+c;++i) f[i][0]=1; 12 for(int i=1;i<=c;++i)//从右向左 13 for(int j=1;j<=k;++j) 14 f[i][j]=(f[i-1][j]+f[i-1][j-1]*(d-j+1))%mod; 15 for(int i=c+1;i<=a+c;++i) 16 for(int j=1;j<=k;++j) 17 f[i][j]=(f[i-1][j]+f[i-1][j-1]*(b+d-j+1))%mod; 18 printf("%d",f[a+c][k]); 19 }