五边形数与拆分数

前言

拆分数P(n),就是将n拆分成正整数的和的方案数。
朴素的做法应该是可以做到时空 O(nn) 一次询问的,但多组询问便毫无办法。
但我们可以通过生成函数和正五边形数的方法来做到 O(nn) 预处理O(1)询问
其实可以看wiki

欧拉函数与五边形数定理

注意这并不是数论中的欧拉函数
定义 ϕ(x)=i=1(1xi)
设拆分数的母函数 P(x) ,根据定义有 P(x)=i=1(1+xi+x2i+x3i)...
也就是 P(x)=1i=1(1xi)
所以 ϕ(x)P(x)=1
但是知道了这一点还是很难做,于是我们需要一个五边形数定理

ϕ(x)=i=(1)ixi(3i1)2

=1+i=1(1)ixi(3i±1)2

其中 i(3i±1)2 这样的数叫做广义五边形数,当取减号的时候代表能够排成五边形的多边形的点数。
不懂的可以看 这里
我们可以发现五边形数是O(n^2)级别的,也就是说我们用这个东西递推的复杂度就是 O(nn)

那么怎么证明呢?
如果觉得我讲的不好的可以看这里
考虑欧拉函数的第n项的系数代表的意义,就是把n拆成互不相同的偶数个正整数的方案数-把n拆成互不相同的奇数个正整数的方案数
考虑 n 的任意一种划分的 Ferrers 图(就是wiki里那种每一行小于上一行的图)
比如n=20时的一种:
0 0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0
0 0 0
设m为最下面一行的元素个数,s为最上面斜对角线的元素个数(这张图里m=3,s=2)
那么我们定义一种变换:
1’当m>s时,将这s个元素放到最后一行
例子中的图会变成
0 0 0 0 0 0
0 0 0 0 0
0 0 0 0
0 0 0
0 0
2’当m<=s时,将这m个元素依次放到前s行每一行的末尾
二次操作后的例子会变成
0 0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0
0 0 0
观察可以发现,这种变换会得到n的一种奇偶性不同的拆分,并且进行两次这种操作之后的图会变回原来的样子,也就是这种操作是可逆的。
那么我们可以发现,每一种偶数划分方案都唯一对应另一种奇数划分方案。
也就是x^n的系数本来应该为0才对,不过有些位置有值?
我们会发现上述的规律对于大多数n都使用,除了少数的特例:
1)m=s+1且s那条线与最后一行相遇
0 0 0 0 0 0
0 0 0 0 0
0 0 0 0
尝试操作之后我们得到
0 0 0 0 0
0 0 0 0
0 0 0
0 0 0
然而这样是不合法的。
这个东西对系数的贡献为(-1)^s
这样子的点的个数

n=(s+1)+(s+2)+..+(2s)=(3s+1)s2

2) m=s且s那条线与最后一行相遇
0 0 0 0 0
0 0 0 0
0 0 0
尝试操作之后我们会得到
0 0 0 0 0 0
0 0 0 0 0
0
奇偶性并没有发生改变,而是变成了另一个状态
这样对系数的贡献也是(-1)^s
点数
n=s+(s+1)+(s+2)+..+(2s1)=(3s1)s2

所以我们发现不合法的情况只有当n为某个广义正五边形数的时候会出现
而且这样的系数恰好为(-1)^s,其他情况都会奇偶抵消,等于等式右边。
Q.E.D

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值