Descritption
给出n,mn,mn,m,求在[1..n][1..n][1..n]中选出m个互不相同的数,它们能作为一个凸多边形的边长的方案数。
n≤109,3≤m≤200n\leq 10^9,3\leq m\leq 200n≤109,3≤m≤200
Solution
我们发现,若干个数能构成凸多边形的条件就是最大值小于其他数之和。
考虑补集转化,计算和不超过最大值的方案数,再用总数(nm)n\choose m(mn)减去
枚举总和sum,那么最大值就由n-sum+1中选法
记[1...sum][1...sum][1...sum]中选m-1个互不相同的数和为sum的方案数(区间右端点取到sum也没有关系,因为m-1>2,所以是不可能等于sum的)
既然要互不相同,我们考虑将这些数从小到大考虑,将它们差分,设原本选的数为a1...am−1a_1...a_{m-1}a1...am−1,差分序列ci=ai−ai−1c_i=a_i-a_{i-1}ci=ai−ai−1,特别的c1=a1c_1=a_1c1=a1。
问题就转化成要求每个c大于0,∑i=1m−1ci∗(m−i)=sum\sum\limits_{i=1}^{m-1}c_i*(m-i)=sumi=1∑m−1ci∗(m−i)=sum
把ccc反一下下标,就是∑i=1m−1ci∗i=sum\sum\limits_{i=1}^{m-1}c_i*i=sumi=1∑m−1ci∗i=sum
考虑生成函数,cic_ici的生成函数就是1−11−xi=xi1−xi1-{1\over 1-x^i}={x^i\over 1-x^i}1−1−xi1=1−xixi
所有变量的生成函数就是∏i=1m−1xi1−xi=xm(m−1)2∏i=1m−1(1−xi)\prod\limits_{i=1}^{m-1}{x^i\over 1-x^i}={x^{m(m-1)\over 2}\over \prod\limits_{i=1}^{m-1}(1-x^i)}i=1∏m−11−xixi=i=1∏m−1(1−xi)x2m(m−1)
这个多项式的次数为iii的项系数乘上n−i+1n-i+1n−i+1就是不超过i的答案
那就是上面的多项式卷上∑(i+1)xi\sum(i+1)x^i∑(i+1)xi了
这显然就是11−x1\over {1-x}1−x1的导数,就是1(1−x)21\over (1-x)^2(1−x)21
那么我们现在的问题就是求xm(m−1)2(1−x)2∏i=1m−1(1−xi){x^{m(m-1)\over 2}\over (1-x)^2\prod\limits_{i=1}^{m-1}(1-x^i)}(1−x)2i=1∏m−1(1−xi)x2m(m−1)的第n项
我们发现下面的式子常数项为1
什么式子分母常数项为1且能快速求第n项呢?
常系数齐次线性递推!
F(x)F(x)F(x)为答案的生成函数,F(x)=F(x)G(x)+T(x)F(x)=F(x)G(x)+T(x)F(x)=F(x)G(x)+T(x),那么F(x)=T(x)1−G(x)F(x)={T(x)\over 1-G(x)}F(x)=1−G(x)T(x)
参考https://blog.youkuaiyun.com/hzj1054689699/article/details/85683342
此时G(x)G(x)G(x)的次数是m2m^2m2级别的,因此需要采用多项式取模和多项式求逆优化。
记得最后还要用组合数减掉。
总的时间复杂度O(m2logm2logn)O(m^2\log m^2\log n)O(m2logm2logn)
Code
为什么没有实现呢?因为博主写了3K的代码WA的不行不想调了