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];
}