Loading

P1350 车的放置 思维 排列组合

P1350 车的放置 思维 排列组合

题意

有下面这样的一个网格棋盘,\(a,b,c,d\) 表示了对应边长度,也就是对应格子数:

img

要在这个棋盘上放 \(k\) 个相互不攻击的车,也就是这 \(k\) 个车没有两个车在同一行,也没有两个车在同一列,问有多少种方案。

\[0\leq a,b,c,d,k\leq 10^3 \]

分析

如果想到了就很简单,(当然此题DP也很简单),把这个多边形分成上下两个区域,枚举放置车的个数,排列组合即可。

当上面的车数是\(x\) 个时,上面的方案数就是\(A_a^x\cdot C_b^x\) ,下面的方案数\(C_d^{k-x}\cdot A_{a+c-x}^{k-x}\) ,相乘就是答案(这里注意一下不要漏掉排列)

代码

ll C[2005][2005];
ll fac[2005];
void get_C() {
    C[0][0] = 1;
    for (int i = 1; i < 2003; i++) {
        C[i][0] = 1;
        for (int j = 1; j <= i; j++)
            C[i][j] = C[i - 1][j] + C[i - 1][j - 1], C[i][j] %= MOD;
    }
    fac[0] = 1;
    for (int i = 1; i < 2003; i++) fac[i] = fac[i - 1] * i, fac[i] %= MOD;
}


int main() {
    get_C();
    int a, b, c, d, k;
    a = readint();
    b = readint();
    c = readint();
    d = readint();
    k = readint();
    ll res = 0;
    for (int i = 0; i <= k; i++) {
        ll now = 1;
        if (i > b || i > a || k - i > d || k - i > a + c - i) continue;
        now *= C[b][i], now %= MOD;
        now *= C[a][i] * fac[i], now %= MOD;
        now *= C[d][k - i], now %= MOD;
        now *= C[a + c - i][k - i ] * fac[k - i], now %= MOD;
        res += now;
        res %= MOD;
    }
    Put(res);
}
posted @ 2020-08-24 22:48  MQFLLY  阅读(155)  评论(0编辑  收藏  举报