CM 2-2 学习文章
置换介绍#
定义: 是 的排列,则 是一个置换。置换是一个排列到排列的一一映射()。
是一个单位元。
置换的乘法和函数的复合本质一样。
置换的逆元定义与数论逆元相似,都是 。
置换满足封闭性,置换的乘法满足结合律。
如果有一个置换 ,且 ,那么这个置换就是轮换。
因此,容易发现一个置换能被唯一分解成若干个轮换。这种分解被称为轮换分解。
置换可以分为两种类型:奇置换和偶置换。其中,偶置换是指置换的逆序对个数为偶数的置换,奇置换相反。
一个小结论:一个置换乘上一个对换,它的奇偶性会改变。
对于置换,还有一种分类方法。我们考虑置换的每个轮换分解的大小构成的集合。我们称 类置换是有 个大小为 的轮换。
Cauchy 公式#
Cauchy 公式:有 个类型为 的置换。
以下为感性计算。
我们先考虑每个轮换内的情况。显然,假设有一个大小为 的轮换,则与他相等的轮换还有 个,总共 个。因此,我们应当将答案乘上 。
我们再考虑相同大小的轮换。我们发现,这些轮换可能通过轮换之间的排列得到与原来一致的置换,因此,我们应当将答案乘上 。
综上,答案为 。
例一 CF612E Square Root of Permutation#
简要题意:给定置换 ,构造置换 使得 。
我们考虑对于每一个轮换 ,它的平方是什么样的。假设 的长度为奇数,容易发现 的长度还是和原来相等。而如果 的长度为偶数,则 是两个大小相等的轮换。因此,我们算出 的各个轮换。对于相等偶数长度的轮换,两两匹配,奇数长的的轮换调整顺序即可。如果不能被分配完就是无解。
例二 P4161 游戏#
简要题意:有多少种不同的长度为 的置换的阶,其中 。
假设对于一个置换 ,它的轮换分解中轮换的大小为 ,显然该置换的阶是 。那么问题转化为当 时, 的不同种数。
发现由于 太大不好做,而且不同种数似乎并不好计算,于是自然地想到找到一个一一映射。容易发现可以加一个限制条件,就是 两两互素。
如果有 ,其中 ,可以被 等效替代。
同理,可以再加一个限制条件:每个 必是 或者 ,其中 为素数。
如果有 ,可以拆成 。
容易发现,如果我们强制 有序,则此时的 个数与 个数一一映射。
如果我们把 去掉,则问题变成 , 单调递增, 的个数有多少。简单线性 dp 可以做到。
void solve() {
n = read();
Eular(n);
dp[0][0] = 1;
for (int i = 1; i <= tot; i ++) {
for (int j = 0; j <= n; j ++) {
dp[i][j] = dp[i - 1][j];
for (int k = 1, now = pr[i]; now <= j; k ++, now *= pr[i])
dp[i][j] += dp[i - 1][j - now];
}
}
long long ans = 0;
for (int j = 0; j <= n; j ++)
ans += dp[tot][j];
cout << ans << '\n';
}
作者:DE_aemmprty
出处:https://www.cnblogs.com/aemmprty/p/18712027
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· DeepSeek R1 简明指南:架构、训练、本地部署及硬件要求
· NetPad:一个.NET开源、跨平台的C#编辑器
· PowerShell开发游戏 · 打蜜蜂