置换介绍

定义:\(p_1, \cdots, p_n\) 是 \(1 - n\) 的排列,则 \(\pi = \begin{pmatrix} 1 & 2 & \cdots & n \\ p_1 & p_2 & \cdots & p_n\end{pmatrix}\) 是一个置换。置换是一个排列到排列的一一映射(\(i \rightarrow p_i\))。

\(e = \begin{pmatrix}1 & 2 & \cdots & n \\ 1 & 2 & \cdots & n\end{pmatrix}\) 是一个单位元。

置换的乘法和函数的复合本质一样。

置换的逆元定义与数论逆元相似,都是 \(p \times p^{-1} = e\)。

置换满足封闭性,置换的乘法满足结合律。

如果有一个置换 \((c_1, c_2, \cdots, c_k)\),且 \(c_1 \rightarrow c_2, c_2 \rightarrow c_3, \cdots, c_k \rightarrow c_1\),那么这个置换就是轮换。

因此,容易发现一个置换能被唯一分解成若干个轮换。这种分解被称为轮换分解。

置换可以分为两种类型:奇置换和偶置换。其中,偶置换是指置换的逆序对个数为偶数的置换,奇置换相反。

一个小结论:一个置换乘上一个对换,它的奇偶性会改变。

对于置换,还有一种分类方法。我们考虑置换的每个轮换分解的大小构成的集合。我们称 \(\Pi_{i = 1}^n i^{c_i}\) 类置换是有 \(c_i\) 个大小为 \(i\) 的轮换。

Cauchy 公式

Cauchy 公式:有 \(\frac{n!}{\prod_{i=1}^n c_i! \times \prod_{i = 1}^n i^{c_i}}\) 个类型为 \(\prod_{i = 1}^n i^{c_i}\) 的置换。

以下为感性计算。

我们先考虑每个轮换内的情况。显然,假设有一个大小为 \(x\) 的轮换,则与他相等的轮换还有 \(x - 1\) 个,总共 \(x\) 个。因此,我们应当将答案乘上 \(\frac{1}{x}\)。

我们再考虑相同大小的轮换。我们发现,这些轮换可能通过轮换之间的排列得到与原来一致的置换,因此,我们应当将答案乘上 \(\frac{1}{c_i!}\)。

综上,答案为 \(\frac{n!}{\prod_{i=1}^n c_i! \times \prod_{i = 1}^n i^{c_i}}\)。

例一 CF612E Square Root of Permutation

简要题意:给定置换 \(p\),构造置换 \(q\) 使得 \(q^2 = p\)。

我们考虑对于每一个轮换 \(t\),它的平方是什么样的。假设 \(t\) 的长度为奇数,容易发现 \(t ^ 2\) 的长度还是和原来相等。而如果 \(t\) 的长度为偶数,则 \(t^2\) 是两个大小相等的轮换。因此,我们算出 \(p\) 的各个轮换。对于相等偶数长度的轮换,两两匹配,奇数长的的轮换调整顺序即可。如果不能被分配完就是无解。

例二 P4161 游戏

简要题意:有多少种不同的长度为 \(n\) 的置换的阶,其中 $ n \leq 1000$。

假设对于一个置换 \(p\),它的轮换分解中轮换的大小为 \(c_1, \cdots, c_k\),显然该置换的阶是 \(\text{lcm}\{c_1, \cdots, c_k\}\)。那么问题转化为当 \(\sum_{i = 1}^n c_i = n\) 时,\(\text{lcm}\{c_1, \cdots, c_k\}\) 的不同种数。

发现由于 \(\text{lcm}\) 太大不好做,而且不同种数似乎并不好计算,于是自然地想到找到一个一一映射。容易发现可以加一个限制条件,就是 \(c\) 两两互素。

如果有 \((dk_1, dk_2) = d\),其中 \(d > 1\),可以被 \(dk_1, k_2, 1, 1, \cdots, 1\) 等效替代。

同理,可以再加一个限制条件:每个 \(c_i\) 必是 \(1\) 或者 \(p_{x}\),其中 \(p\) 为素数。

如果有 \(c_i = p^xy\),可以拆成 \(p^x, y, 1, \cdots, 1\)。

容易发现,如果我们强制 \(c_i\) 有序,则此时的 \(c_i\) 个数与 \(\text{lcm}\) 个数一一映射。

如果我们把 \(1\) 去掉,则问题变成 \(c_i = p_i^x\),\(p_i\) 单调递增,\(\sum_{i = 1}^n c_i \leq n\) 的个数有多少。简单线性 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';
}

CM 2-2 学习文章的更多相关文章

  1. Java 学习文章汇总

    目前JAVA可以说是产业界和学术界最热门的语言,许多人都很急切想把JAVA学好. 但学习是需要步骤的,除非像电影中演的那样,能够把需要的专业技巧下载到脑海:主角只花了几秒下载资料,就马上具备飞行员的技 ...

  2. webview之学习文章(待续)

    webview与js交互: Tencent/VasSonic(缓存优化方案) lzyzsd/JsBridge: pengwei1024/JsBridge: -----webview的框架 TheFin ...

  3. JavaEE学习文章汇总-并发,集群,分布式

    以下文章来自博客 http://blog.csdn.net/FX_SKY/article/category/6203839 其中包括 集群Zookeeper 环境搭建 http://blog.csdn ...

  4. Zookeeper学习文章目录1

    目录:参考文章如下 1.ZooKeeper学习第一期---Zookeeper简单介绍 2. ZooKeeper学习第二期--ZooKeeper安装配置 3. ZooKeeper学习第三期---Zook ...

  5. Python 学习文章收藏

    作者 标题 rollenholt Python修饰器的函数式编程 - Rollen Holt - 博客园 rollenholt python操作gmail - Rollen Holt - 博客园 ro ...

  6. nginx配置学习文章

    partOne 自我释义部分 我的是阿里云的ubuntu *******实际上感觉这里是基本配置,很用不到*********#定义其用户或用户组user www-data;#nginx的进程数,应当为 ...

  7. Dubbo源码学习文章目录

    目录 Dubbo源码学习--服务是如何发布的 Dubbo源码学习--服务是如何引用的 Dubbo源码学习--注册中心分析 Dubbo源码学习--集群负载均衡算法的实现

  8. react 学习文章

    生命周期 学习笔记 一些坑 项目完成后总结 理解Immutable 是否要同构如何同构 react组件最佳实践 redux集合所有的state props来源, 页面所有状态 数据的唯一来源 reac ...

  9. 系列文章--WCF后传学习文章

    WCF后传系列(10):消息处理功能核心 摘要: WCF是一个通信框架,同时也可以将它看成是一个消息处理或者传递的基础框架,它可以接收消息.对消息做处理,或者根据客户端给定的数据构造消息并将消息发送到 ...

  10. Asp.net Core学习文章

    杜现鹏的Asp.net Core文章 EF Core 官方教程 https://docs.microsoft.com/en-us/ef/core/get-started/aspnetcore/new- ...

随机推荐

  1. K8s新手系列之Endponit

    概述 官方文档:https://kubernetes.io/zh-cn/docs/reference/kubernetes-api/service-resources/endpoints-v1/ En ...

  2. frp增加IP限制

    核心设计理念 传统frp安全方案的不足 静态配置文件管理白名单IP,修改需要重启服务 分布式环境下多节点配置同步困难 缺乏实时阻断恶意IP的能力 Redis作为动态白名单存储的优势 实时生效:IP规则 ...

  3. x86游戏逆向之实战游戏线程发包与普通发包的逆向

    网游找Call的过程中难免会遇到不方便通过数据来找的或者仅仅查找数据根本找不到的东西,但是网游中一般的工程肯定要发给服务器,比如你打怪,如果都是在本地处理的话就特别容易产生变态功能,而且不方便与其他玩 ...

  4. 我的Vue之旅(3)

    2020-10-24 程序员节快乐哈! 因为有相当一部分内容都是相互穿插的,今天也就不写那么多重复的Demo了,直接写一下对所学内容的理解吧. 插值 关于插值这一块其实也没啥说的,文本插值都是最熟悉不 ...

  5. 阿里云ECS(Ubuntu 22.04 LTS)优化脚本

    #!/bin/bash set -e echo " Updating system..." apt update -y && apt upgrade -y echo ...

  6. LUNARiA

    本文同步发布于我的网站 也算是头一次在没有任何安利和剧透,仅在看了简介的情况下就直接下单并开始游玩一部gal了.果然,没有给我留下什么遗憾呢. 游玩日志 SKYOUT-FOREVER <LUNA ...

  7. 未来已来?vSphere 9 预览版部署体验

    最近看到不少技术爱好者开始分享 vSphere 9 的基础体验镜像,作为 VMware 的忠实粉丝,怎么能错过这波"尝鲜"机会呢? 趁着空闲时间,我也动手安装体验了一下.从初步使用 ...

  8. python基础—集合

    一.集合(数字,字符串,元组) 1.定义 由不同元素组成的集合,集合中是一组无序排列的哈希值,可以作为字典的key 2.特性 无序,不同元素组成,必须是不可变类型 3.set输出与去重 s=set(' ...

  9. K8S的API Server认证介绍

    一.说明 kube-apiserver是k8s最重要的制组件之一,主要提供以下功能: 提供集群管理的REST API 接口, 包括认证授权.数据校验以及集群状态变更等 k8s 中所有模块与 etcd ...

  10. 大巧不工,袋鼠云正式开源大数据任务调度平台——Taier(太阿)!

    2022年2月22日,在今天这个特殊的日子里,历经多年持续迭代和千万周期实例并发调度考验的Taier(太阿)终于开源了! Github开源地址: https://github.com/DTStack/ ...