P1350 车的放置 思维 排列组合

P1350 车的放置 思维 排列组合

题意

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

img

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

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

分析

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

当上面的车数是(x) 个时,上面的方案数就是(A_a^xcdot 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);
}
原文地址:https://www.cnblogs.com/hznumqf/p/13556954.html