【2018.12.28模拟赛】再一次张开翅膀 【多项式】【生成函数】【线性递推】(无实现)

本文探讨了一个组合数学问题,即在指定范围内选取特定数量的互不相同整数,使其能构成一个凸多边形的边长。通过补集转化、生成函数和多项式取模等技巧,提出了高效求解方案数的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Descritption

给出n,mn,mn,m,求在[1..n][1..n][1..n]中选出m个互不相同的数,它们能作为一个凸多边形的边长的方案数。

n≤109,3≤m≤200n\leq 10^9,3\leq m\leq 200n109,3m200

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...am1,差分序列ci=ai−ai−1c_i=a_i-a_{i-1}ci=aiai1,特别的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=1m1ci(mi)=sum

ccc反一下下标,就是∑i=1m−1ci∗i=sum\sum\limits_{i=1}^{m-1}c_i*i=sumi=1m1cii=sum
考虑生成函数,cic_ici的生成函数就是1−11−xi=xi1−xi1-{1\over 1-x^i}={x^i\over 1-x^i}11xi1=1xixi
所有变量的生成函数就是∏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=1m11xixi=i=1m1(1xi)x2m(m1)

这个多项式的次数为iii的项系数乘上n−i+1n-i+1ni+1就是不超过i的答案
那就是上面的多项式卷上∑(i+1)xi\sum(i+1)x^i(i+1)xi

这显然就是11−x1\over {1-x}1x1的导数,就是1(1−x)21\over (1-x)^2(1x)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)}(1x)2i=1m1(1xi)x2m(m1)的第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)=1G(x)T(x)
参考https://blog.youkuaiyun.com/hzj1054689699/article/details/85683342
此时G(x)G(x)G(x)的次数是m2m^2m2级别的,因此需要采用多项式取模和多项式求逆优化。

记得最后还要用组合数减掉。

总的时间复杂度O(m2log⁡m2log⁡n)O(m^2\log m^2\log n)O(m2logm2logn)

Code

为什么没有实现呢?因为博主写了3K的代码WA的不行不想调了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值