P4071 [SDOI2016] 排列计数

原题

我们先从n个数里选m个数钦定这些数满足ai=i,因此原问题就等于让nm个数的排列满足aii的排列方案数

先说一个错误的做法:设dpi表示长为i的排列的方案数。我们每次枚举一个大小为j的环,可以得到递推式子:

dpi=j=2idpij×(j1)!×(ij)

其中(j1)!为组成一个大小为j的环的方案数,(ij)表示从i个排列中选j个,让他们组成环

我们发现这个是不对的,比如2 1 4 3,(ij)会同时计算钦定环为2 1和4 3的情况,这很明显会重复。寄


方法1:

正解做法:设dpi表示长为i的排列的方案数。每次我们判断n这个数放在哪个位置:

  1. 放在不是n所在位置的位置,让后把这个位置删掉(因为他已经被填数了,而且这次填数没有任何环构成)

  2. 放在不是n所在位置的位置,并且这个位置的下标的数放在n这个位置(此时构成了一个环)

因此可以得出递推式:dpi=(i1)×dpi1+(i1)×dpi2

思路总结:对于与环的个数有关的问题,递推式要考虑删掉环上一个没用的点或删掉一个大小为2的环的两种情况


方法2:

fi表示有iap=p的方案数,gi表示=iap=p的方案数,可以发现计算fi是非常容易的:fi=(ni)×(ni)!

可以发现\(f_i = \sum_{j=i}^{n}{\binom{j}{i} \times g_i\),二项式反演(详情见之后写的博客)即可

gi=j=in(1)ji×(ji)×fi

被xjk搏杀了,我tcl

posted @   FOX_konata  阅读(7)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
点击右上角即可分享
微信分享提示