1 条题解
-
0
车的放置(Placing Rooks) 题解
思路分析
将 L 形棋盘按水平线切分为上方的 矩形(宽 列、高 行)和下方的 矩形(宽 列、高 行)。枚举上方矩形放置 个车():
- 在上方选 行 列并排列配对,方案数为 ;
- 下方需放 个车,此时上方用掉的 列不能再放,故下方剩余可用列数为 ,方案数为 $\mathrm{C}_d^{k-i} \cdot \mathrm{C}_{a+c-i}^{k-i} \cdot (k - i)!$。 对所有合法的 求和并对质数 取模即可。预处理阶乘与组合数后时间复杂度 或 。
参考代码
#include <algorithm> #include <iostream> using namespace std; const int MOD = 100003; const int MX = 2005; int C[MX][MX]; int fact[MX]; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int a, b, c, d, k; if (!(cin >> a >> b >> c >> d >> k)) return 0; for (int n = 0; n < MX; ++n) { C[n][0] = 1; for (int r = 1; r <= n; ++r) C[n][r] = (C[n - 1][r - 1] + C[n - 1][r]) % MOD; } fact[0] = 1; for (int i = 1; i < MX; ++i) fact[i] = (1LL * fact[i - 1] * i) % MOD; long long ans = 0; for (int i = 0; i <= k; ++i) { if (i > a || i > b) continue; int rem = k - i; if (rem > d || rem > a + c - i) continue; long long topWays = 1LL * C[b][i] * C[a][i] % MOD * fact[i] % MOD; long long botWays = 1LL * C[d][rem] * C[a + c - i][rem] % MOD * fact[rem] % MOD; ans = (ans + topWays * botWays) % MOD; } cout << ans << "\n"; return 0; }
- 1
信息
- ID
- 8569
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- (无)
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者