题解:P11316 [RMI 2021] 去 M / NoM
来一个不要容斥的做法。
标号可以最后再乘,问题变为
设
每对的颜色有
因为
rep(i, 1, 2 * n)cnt[i % m]++;
f[0][0] = 1;
int sum = 0;
rep(i, 0, m - 1) {
rep(j, 0, sum)if (f[i][j]) {
rep(k, 0, min(j, cnt[i])) {
add(f[i + 1][j + cnt[i] - 2 * k], 1LL * f[i][j] * C(cnt[i], k) % mod * C(j, k) % mod * fac[k] % mod);
}
}
sum += cnt[i];
}
printf("%d", 1LL * f[m][0] * qpow(2, n) % mod * fac[n] % mod);