P1350 车的放置 思维 排列组合
P1350 车的放置 思维 排列组合
题意
有下面这样的一个网格棋盘,\(a,b,c,d\) 表示了对应边长度,也就是对应格子数:
要在这个棋盘上放 \(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);
}