乘法原理,加法原理,多重集的排列数(多个系列操作穿插的排列数) 进阶指南 洛谷p4778
https://www.luogu.org/problemnew/solution/P4778
非常好的题目,囊括了乘法加法原理和多重集合排列,虽然最后使用一个结论解出来的。。
给定一个n的排列,用最少的次数将排列变成单调递增
请问这样的操作有多少种
套路:位置i向位置p[i]连单向边,最后会形成l个环
先来考虑单个环:
引理:将长度为len的环拆成len个自环至少操作len-1次
套路:
一个数对应有且仅有一个位置,且一个位置有且仅有一个数
这就意味着整个图上每个点入度出度都为1
也就意味着图上的环都是简单环
于是DFS找环并统计长度可以用很简单的代码实现
每次交换操作实际上是交换边,在单向边组成的环中交换任意两条边后必定形成两个独立的环
即每次交换操作会将len的环拆成长度为x,y的两环
那么考虑有多少种拆法T(x,y)=(x==y?x:x+y)种拆分方式
设F[len]为将长度len的环拆成len个自环的操作方法数
显然有F[len]=sum{先拆成(i,len-i)的方法数}
那么先拆成(i,len-i)的方法数=T(i,len-i)*F[i]*F[len-i]*step(i,len-i)
由于把长为i的环拆成自环要i-1步,长len-i的环拆成自环要len-i-1步,这些步数可以先后穿插,但是一个环集合内自己的步数本可以打乱,所以等价于可重集合的排列数
由多重集的排列数,总共有step(i,len-i)=(len-2)!/(i-1)!*(len-i-1)! 种步数
所以最后一个长为len的环的公式是
F[len]=sum:T(i,len-i)*F[i]*F[len-i]*(len-2)!/(i-1)!*(len-i-1)!
所以最终答案是所有环相乘 ,再乘可重集合的排列数,即环于环相乘时步数也是可以先后穿插的!
事实上,有F[len]=len^(len-2)的结论
乘法原理,加法原理,多重集的排列数(多个系列操作穿插的排列数) 进阶指南 洛谷p4778的更多相关文章
- codeforces 429 On the Bench dp+排列组合 限制相邻元素,求合法序列数。
限制相邻元素,求合法序列数. /** 题目:On the Bench 链接:http://codeforces.com/problemset/problem/840/C 题意:求相邻的元素相乘不为平方 ...
- 洛谷P2723 丑数 Humble Numbers
P2723 丑数 Humble Numbers 52通过 138提交 题目提供者该用户不存在 标签USACO 难度普及/提高- 提交 讨论 题解 最新讨论 暂时没有讨论 题目背景 对于一给定的素数 ...
- 洛谷P4609 [FJOI2016]建筑师 【第一类斯特林数】
题目链接 洛谷P4609 题解 感性理解一下: 一神带\(n\)坑 所以我们只需将除了\(n\)外的\(n - 1\)个元素分成\(A + B - 2\)个集合,每个集合选出最大的在一端,剩余进行排列 ...
- 如何求先序排列和后序排列——hihocoder1049+洛谷1030+HDU1710+POJ2255+UVA548【二叉树递归搜索】
[已知先序.中序求后序排列]--字符串类型 #1049 : 后序遍历 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Ho在这一周遇到的问题便是:给出一棵二叉树的前序和 ...
- 洛谷P4609 [FJOI2016]建筑师(第一类斯特林数+组合数)
题面 洛谷 题解 (图片来源于网络,侵删) 以最高的柱子\(n\)为分界线,我们将左边的一个柱子和它右边的省略号看作一个圆排列,右边的一个柱子和它左边的省略号看作一个圆排列,于是,除了中间的最高的柱子 ...
- 洛谷 P2606 [ZJOI2010]排列计数 解题报告
P2606 [ZJOI2010]排列计数 题目描述 称一个\(1,2,...,N\)的排列\(P_1,P_2...,P_n\)是\(Magic\)的,当且仅当对所以的\(2<=i<=N\) ...
- 洛谷P2723 丑数 Humble Numbers [2017年 6月计划 数论07]
P2723 丑数 Humble Numbers 题目背景 对于一给定的素数集合 S = {p1, p2, ..., pK},考虑一个正整数集合,该集合中任一元素的质因数全部属于S.这个正整数集合包括, ...
- noip模拟9[斐波那契·数颜色·分组](洛谷模拟测试)
这次考试还是挺好的 毕竟第一题被我给A了,也怪这题太简单,规律一眼就看出来了,但是除了第一题,剩下的我只有30pts,还是菜 第二题不知道为啥我就直接干到树套树了,线段树套上一个权值线段树,然后我发现 ...
- 洛谷 P5206 - [WC2019]数树(集合反演+NTT)
洛谷题面传送门 神仙多项式+组合数学题,不过还是被我自己想出来了( 首先对于两棵树 \(E_1,E_2\) 而言,为它们填上 \(1\sim y\) 使其合法的方案数显然是 \(y\) 的 \(E_1 ...
随机推荐
- Spring的aop操作
1 在spring里面进行aop操作,使用aspectj实现(1)aspectj不是spring一部分,和spring一起使用进行aop操作(2)Spring2.0以后新增了对AspectJ支持2 使 ...
- JavaScript编程基础2
1,数据类型相关操作 使用typeof x函数查看变量的数据类型: typeof "John" // 返回 string typeof 3.14 // 返回 number type ...
- shell编程 之 运算符
1 shell运算符简介 Shell 和其他编程语言一样,支持多种运算符,包括: 算数运算符 形如:val=`expr 2 + 2`:echo "两数之和为 : $val" ...
- python set 使用
创建集合set python set类是在python的sets模块中,大家现在使用的python2.7.x中,不需要导入sets模块可以直接创建集合.>>>set('boy')se ...
- Iterables vs. Iterators vs. Generators
Reprinted from: Iterables vs. Iterators vs. Generators Occasionally I've run into situations of conf ...
- Git学习笔记01-安装Git
学习的资料来自廖雪峰官方网站的Git教程,菜鸟教程的Git教程 Git是一个分布式版本控制工具,在windows上使用Git可以直接从官网下载,然后默认选项安装即可. 安装完成后,在开始菜单中找到找到 ...
- 码云 Git No network connection
背景 git,好久没用了都.心血来潮还是赶紧熟悉下吧.果不其然,每次要熟悉或开始一个东西,立马就出现问题.本来好好的环境竟然不行了,搞定后感觉应该是换了网络环境的事.这倒次要,主要让我想起了最初学习g ...
- ubuntu 安装 库文件
ubuntu 16.4 安装freeradius 时,缺少库文件 libtalloc, 使用命令: sudo apt-get install libtalloc 发现找不到库文件 libtallo ...
- javascript日期格式yyyyMMddHHmmss
1. function GetDateTimeToString() { var date_ = new Date(); var year = date_.getFullYear(); ; var da ...
- zepplin0.7.2报错ERROR, exception: null, result: %text java.lang.NullPointerException的处理
zepplin0.7.2报错ERROR, exception: null, result: %text java.lang.NullPointerException的处理 问题描述: 使用zeppli ...