Description
给定一个 L 型的网格棋盘,其中两段的宽分别为 (a,c),两段的高分别为 (b,d),在这个棋盘上放置 (k) 个不会互相攻击的车,求方案数。(n le 2000)
Solution
设 (f[i][j]) 表示前 (i) 行放置了 (j) 个车的方案数,则 (f[i][j]) 可以从 (f[i-1][j]) 和 (f[i-1][j-1]) 转移得来,注意后者需要乘上一个系数,即本次可以做选择的数量
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 2005;
const int mod = 100003;
int a,b,c,d,k,f[N][N];
signed main()
{
cin>>a>>b>>c>>d>>k;
f[0][0]=1;
for(int i=1;i<=b+d;i++)
{
f[i][0]=1;
for(int j=1;j<=min(i,k);j++)
{
f[i][j]=f[i-1][j]+f[i-1][j-1]*(a+(i<=b?0:c)-j+1);
f[i][j]%=mod;
}
}
cout<<f[b+d][k];
}