心得
其实具体数学上都有,就当做笔记了,整理一些知识点和结论
思路来源
https://www.cnblogs.com/Milkor/p/4734763.html
https://www.cnblogs.com/YoungNeal/p/10366962.html
①斐波那契数
F[1]=F[2]=1,F[n]=F[n-1]+F[n-2],这里令F[0]=0
可以矩阵快速幂,做到O(logn)求第n项(n<=1e18)
常用结论:(不附证明,用F[n]=F[n-1]+F[n-2]代入展开或递归代入即证,证明见思路来源)
F(n)与F(n-1)互质
②第一类斯特林数
将 n 个元素划分为 m 个圆排列(环,由环上的数组成)的方案数。
s(n,m)=s(n-1,m-1)(第n个自己开一个圆)+(n-1)*s(n-1,m)(第n个插入之前的n-1个元素构成的空位,环上有x个元素则有x个空位)
相关公式:
比如排列 (1,5,2,3,4),就可以看作轮换组 [1][2,5,4,3]。
(令i跳向pi,则第二位置的5跳到第五位置,第四位置,第三位置,有轮换组[2,5,4,3]成立,显然排列与轮换一一对应)
所以等式右侧的式子就是有 0∼n 个轮换组依次对应的方案数之和。
快速求某行或某个的第一类斯特林数的系数,需要用生成函数NTT之类,不会,待补
dp[i][j]前i个能看到j个,考虑放到结尾的数是不是最大的数,
是的话+=dp[i-1][j-1],不是的话i-1个抽一个过来(i-1)*dp[i-1][j]
③第二类斯特林数
第二类斯特林数S(n,m),S(n,m)=n个不同小球,放到m个相同盒子的方案,要求盒子均非空
①
S(n,m)=S(n-1,m-1)(第n个自己放一个盒子)+m*S(n-1,m)(第n个可以放之前的m个盒子的任意一个)
②S(n,m)=n个不同球,放到m个不同盒子,不能有空盒子=−(一定有空盒子的)
n个不同球,放到m个不同盒子至少有一个空盒子(先选一个必空的,后面的可能空),
这样计算是有重复(比如先1后2也是空,先2后1也是空),
这种计算至少有一个空盒子的方法,会使恰好有一个空盒子的方案被计算一次,恰好有两个空盒子的方案被计算两次,恰好有三个空盒子的方案被计算三次,
于是就和三个圆容斥原理的那个过程相同了,第一次求的是三个圆的面积之和,此时就需要用到容斥原理。
无空盒子的方案为
不同盒子转化为相同盒子,除掉顺序即可,
有
ll ans=0,sg=1;
for(int i=m;i>=1;--i){
ans=(ans+modpow(i,n)*C(m,i)%mod)%mod;//m个里选i个必放 再在这i个里面随便放n个球
sg*=-1;
}
ans=ans*finv[m]%mod;
也可以理解为,
第一步加至少有零个空盒子的方案数,,
第二步减至少有一个空盒子的方案数,
以此类推,
如果难以记住符号正负,
可以理解为第一步一定是所有方案,+
会算多,后续再减即可
相关公式:
k个不同求放在x个不同盒子里,每个球有x种选择,即。
或是枚举有多少非空盒子C(n,i),对于盒子方案数为i!∗S(k,i)。
两种理解角度,故有式子成立
应用:Educational Codeforces Round 86 (Rated for Div. 2) E. Placing Rooks
感觉是用容斥,推导了一遍,第二类斯特林数