【总结】第一类和第二类斯特林数-cf960G&bzoj5093图的价值

参考资料:
第一类斯特林数求自然数幂和学习小记
第二类斯特林数 学习总结
第一和第二类斯特林数小结
具体数学·斯特林数


第一类斯特林数

[ n k ] \left[ \begin{matrix} n\\k\end{matrix} \right] [nk]指将 n n n个不同的元素排成 k k k轮换方案数。

递推式: [ n k ] = [ n − 1 k − 1 ] + ( n − 1 ) [ n − 1 k ] \left[ \begin{matrix} n\\k\end{matrix} \right]=\left[ \begin{matrix} n-1\\k-1\end{matrix} \right]+(n-1)\left[ \begin{matrix} n-1\\k\end{matrix} \right] [nk]=[n1k1]+(n1)[n1k]

生成函数: ∏ i = 0 n − 1 ( x + i ) \prod \limits_{i=0}^{n-1}(x+i) i=0n1(x+i)
其第 k k k项( x k x^k xk)的系数即为 [ n k ] \left[ \begin{matrix} n\\k\end{matrix} \right] [nk]
使用分治 F F T FFT FFT可以 O ( n l o g 2 n ) O(nlog^2n) O(nlog2n)求解

与阶乘的关系: n ! = ∑ k = 0 n [ n k ] n!=\sum_{k=0}^n\left[ \begin{matrix} n\\k\end{matrix} \right] n!=k=0n[nk]
因为对于一个 1 − n 1-n 1n的排列 P P P,每一种排列方式都对应着一个轮换的集合(从群论( p o l y a / b u r n s i d e polya/burnside polya/burnside)中可以感受到排列和轮换安排本质上的相同)。

例题:CF960G

题意:

给定 n , A , B n,A,B n,A,B,求有多少个 1 − n 1-n 1n的排列 P = a 1 , a 2 , . . , a n P={a_1,a_2,..,a_n} P=a1,a2,..,an满足从 a 1 a_1 a1开始向右的最长递增序列长度为 A A A且从 a n a_n an开始向左的最长递增序列长度为 B B B n ≤ 1 0 5 , m o d    998244353 n\leq10^5,\mod 998244353 n105,mod998244353

题解:

一个数被选中的要求是它前面(从 a n a_n an开始就是后面)没有比它大的数。

无论从 a 1 a_1 a1还是从 a n a_n an开始,最后都在值为 n n n处结束,所以 n n n a 1 a_1 a1 a n a_n an的递增数列截断了,问题转化成了在 a 1 − ( n − 1 ) a_1-(n-1) a1(n1)之间选择 A − 1 A-1 A1个并在 ( n + 1 ) − a n (n+1)-a_n (n+1)an之间选择 B − 1 B-1 B1个满足上述要求的数( a 1 , a n a_1,a_n a1,an包含在内)。

本质上就是把 n − 1 n-1 n1个数(没有考虑 n n n)划分成 A + B − 2 A+B-2 A+B2个非空集合,任选 A − 1 A-1 A1个集合放在 n n n左边,剩下 B − 1 B-1 B1个放在 n n n右边,按每个集合中的最大数升序排列后就保证了每个集合必然会选择一个,符合了要求。

a n s = [ n − 1 A + B − 2 ] ( A + B − 2 A − 1 ) ans=\left[ \begin{matrix} n-1\\A+B-2\end{matrix} \right]\binom{A+B-2}{A-1} ans=[n1A+B2](A1A+B2)

代码(含分治 F F T FFT FFT求解第一类斯特林数):

#include<bits/stdc++.h>
using namespace std;
const int mod=998244353,g=3,N=5e5+10;
typedef long long ll;

int n,x,y,nv[200010],a[19<
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值