专栏文章

题解:P11316 [RMI 2021] 去 M / NoM

P11316题解参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@mina7d5g
此快照首次捕获于
2025/12/01 23:05
3 个月前
此快照最后确认于
2025/12/01 23:05
3 个月前
查看原文
来一个不要容斥的做法。
标号可以最后再乘,问题变为 2n2n 个点两两配对,配对的距离不是 mm 倍数的方案数,等价于不能让模 mm 同余的配对。
fi,jf_{i,j} 表示前 ii 个同余类,总共有 jj 个要和后面的配对,的方案数。 设第 ii 个同余类有 cic_{i} 个点。转移就枚举第 i+1i+1 个同余类和前面配多少对,对于 k[0,min(j,ci+1)]k\in [0,\min(j,c_{i+1})]
fi,j(ci+1k)(jk)k!fi+1,jk+ci+1kf_{i,j}\binom{c_{i+1}}{k}\binom{j}{k}k! \to f_{i+1,j-k+c_{i+1}-k}
每对的颜色有 22 种选择,编号是一个排列,答案就是 fm,02nn!f_{m,0}2^{n}n!
因为 ci=n\sum c_i = n,所以复杂度是 O(n2)O(n^2)
CPP
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);

评论

0 条评论,欢迎与作者交流。

正在加载评论...