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

相关文章:

  • 2022-12-23
  • 2021-08-24
  • 2022-12-23
  • 2022-03-02
  • 2022-02-18
  • 2021-06-03
  • 2022-12-23
  • 2022-12-23
猜你喜欢
  • 2022-02-03
  • 2021-08-08
  • 2022-12-23
  • 2021-04-16
  • 2021-07-19
相关资源
相似解决方案