DistinctAdjacent
[ABC307E] Distinct Adjacent
解答1:
我们将圆环上有
代码
解答2:
DP
这道题可以看作是 ABC256G 和 ABC232E 的简化版。
圆环上的DP
对于一排排列的情况,我们可以考虑 DP,定义状态
对于围成一圈的情况,我们可以先固定第一个人手中的数字为
但是,这样的 DP 状态数和转移数都是
例题:
另外,我们还可以使用包除原理来求解。注意到,我们需要满足
解答3:
答案是
- 包括排斥原理
使用包括排斥原理,可以得出方案数为
整理得到
- DP 的优化
公式解释中的 DP 可以写成矩阵乘法的形式,因为转移不依赖于
整理得到
以下是一个实现的例子:
#include <bits/extc++.h>
#include <atcoder/modint>
int main() {
using namespace std;
int N, M;
cin >> N >> M;
atcoder::static_modint<998244353> m = M - 1;
cout << (m.pow(N) + (N & 1 ? -m : m)).val() << endl;
return 0;
}
N, M = map(int, input().split())
p = 998244353
print((pow(M - 1, N, p) + pow(-1, N, p) * (M - 1)) % p)
本文作者:wscqwq
本文链接:https://www.cnblogs.com/wscqwq/p/17511615.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步