2022.8.19 闲话 — partition

《夜に駆ける》

《夜に駆ける》

沈むように溶けてゆくように

二人だけの空が広がる夜に

「さよなら」だけだった

その一言で全てが分かった

日が沈み出した空と君の姿

フェンス越しに重なっていた

初めて会った日から

仆の心の全てを夺った

どこか儚い空気を缠う君は

寂しい目をしてたんだ

いつだってチックタックと

鸣る世界で何度だってさ

触れる心无い言叶うるさい声に

涙が零れそうでも

ありきたりな喜びきっと二人なら见つけられる

騒がしい日々に笑えない君に

思い付く限り眩しい明日を

明けない夜に落ちてゆく前に

仆の手を掴んでほら

忘れてしまいたくて闭じ込めた日々も

抱きしめた温もりで溶かすから

怖くないよいつか日が昇るまで

二人でいよう

君にしか见えない

何かを见つめる君が嫌いだ

见惚れているかのような恋するような

そんな颜が嫌いだ

信じていたいけど信じれないこと

そんなのどうしたってきっと

これからだっていくつもあって

そのたんび怒って泣いていくの

それでもきっといつかはきっと仆らはきっと

分かり合えるさ信じてるよ

もう嫌だって疲れたんだって

がむしゃらに差し伸べた仆の手を振り払う君

もう嫌だって疲れたよなんて

本当は仆も言いたいんだ

ほらまたチックタックと

鸣る世界で何度だってさ

君の为に用意した言叶どれも届かない

「终わりにしたい」だなんてさ

钓られて言叶にした时

君は初めて笑った

騒がしい日々に笑えなくなっていた

仆の目に映る君は绮丽だ

明けない夜に溢れた涙も

君の笑颜に溶けていく

変わらない日々に泣いていた仆を

君は优しく终わりへと诱う

沈むように溶けてゆくように

染み付いた雾が晴れる

忘れてしまいたくて闭じ込めた日々に

差し伸べてくれた君の手を取る

凉しい风が空を泳ぐように今吹き抜けていく

繋いだ手を离さないでよ

二人今、夜に駆け出していく

关注向晚,夜に駆ける

怎么没人看我的 MST 社论呢?

分拆数

题目描述

整数划分A000041

给一个正整数 \(n\),求将 \(n\) 分为若干个整数的和,有多少种不同的划分方式,答案对 \(10^9+7\) 取模 .

答案,即分拆数记作 \(B(n)\),其 \(B\) 整数上的点值组成序列 \(\{f\}\)(记号可能比较奇怪).

前几项的分拆数:

\(n\) \(0\) \(1\) \(2\) \(3\) \(4\) \(5\) \(6\) \(7\) \(8\)
\(B(n)\) \(1\) \(1\) \(2\) \(3\) \(5\) \(7\) \(11\) \(15\) \(22\)

提交通道:51nod #1259 整数划分 V2[NOI Online #1 入门组] 跑步hdu4651 Partition .

Bonus:求一行分拆数(LOJ #6268).

根号分治 DP

\(L=\sqrt n\),则:

  • 对于 \(>L\) 的数,令 \(dp_{i,j}\) 表示选了 \(i\) 个数总和为 \(i(L+1)+j\) 的方案数,于是

    \[dp_{i,j}=dp_{i-1,j}+dp_{i-,j-1} \]

    大概就是分两种情况讨论 —— 新加一个 \(S+1\) 或者把前面的所有数全部加一 .
  • 对于 \(\le L\) 的数,直接暴力背包 .

时间复杂度 \(O(n\sqrt n)\) .


如何解决 Bonus?

合并两种情况的时候 MTT 一下即可 .

时间复杂度还是 \(O(n\sqrt n)\) .

Euler 变换

考察 \(f\) 的 OGF \(F(z)\) .

其实这个分拆数就是完全背包特例,我们枚举使用了多少个 \(1\),多少个 \(2\),多少个 \(3\)\(\dots\) 就可以得到

\[\displaystyle F(z)=\prod_{k\ge 0}\dfrac1{1-z^i} \]

根据 Euler 变换(或者说 Symbolic Method 中的 Multiset(MSET)构造),可以得到形式幂级数恒等式:

\[\prod_{i\ge 0}\left(\dfrac{1}{1-x^i}\right)^{a_i}=\exp\left(\sum_{j\ge 1}\dfrac{F^{\star}(x_j)}{j}\right) \]

其中 \(F^{\star}(x)\)\(\{a_ix^i\}\) 的 OGF .

然后直接算一下就是 \(O(n\log n)\) 了,任意模数可能比较麻烦……不过确实是可做的 .

Bonus 自然地被解决 /oh/hsh

五边形数定理

定义欧拉函数

\[\phi(x)=\prod_{k\ge 1}(1-x^k) \]

则有五边形数定理

\[\boxed{\phi(x)=\sum_k(-1)^kx^{p_k}} \]

其中 \(p_k=\dfrac{k(3k\pm 1)}2\) 被称作广义五边形数(\(k<0\) 时取 \(+\),否则取 \(-\)).

实用推论:

\[\phi(x)=1+\sum_{k\ge 1}(-1)^ix^{p^{\star}_k} \]

其中 \(p^{\star}_k=\dfrac{k(3k-1)}2\) 被称作五边形数 .

证明可以看 visit_world 的博客OI Wiki .


我们知道 \(\{f\}\) 的 OGF \(F(z)\) 满足:

\[\displaystyle F(z)=\prod_{k\ge 0}\dfrac1{1-z^i} \]

又结合欧拉函数 \(\phi(x)\) 定义,我们知道:

\[\displaystyle F(z)=\dfrac1{\phi(z)} \]

于是根据五边形数定理,我们可以得到

\[\begin{aligned}\phi(z)\sum_{k\ge 0}f_kx^k&=(1-x-x^2+x^5+x^7-\cdots)(1+f_1x+f_2x^2+\cdots)\\&=1\end{aligned} \]

两边提取系数得

\[f_k-f_{k-1}-f_{k-2}+f_{k-5}+f_{k-7}-\cdots=0 \]

实际上就是广义五边形数 .

这样我们得到了一个 \(B\) 的递推式,直接计算即可,因为广义五边形数是 \(O(n^2)\) 的,所以递推式长度是 \(O(\sqrt n)\) 的,于是时间复杂度就是 \(O(n\sqrt n)\) 的 .

Bonus 自然地被解决 /oh/hsh

如何做得更快?因为 \(\phi(z)F(z)=1\) 所以直接无脑求逆即可 \(O(n\log n)\) .

带限制分拆数

题目描述

带限制整数划分A000041

给一个正整数 \(n\),将 \(n\) 分为若干个整数的和,特别的,要求每个正整数出现次数 \(<k\),问有多少种不同的划分方式,答案对 \(10^9+7\) 取模 .

提交通道:hdu4658 Integer Partition .

解法

令答案序列为 \(\{a\}\),OGF 为 \(F(z)\),直接分析 OGF,类似整数划分,我们可以得到

\[F(z)=\prod_{k\ge 0}(1−z^{ik})B(z) \]

由五边形数定理得

\[F(z)=(1-x^k-x^{2k}+x^{5k}+x^{7k}-\cdots)(1+B(1)x+B(2)x^2+B(3)x^3+\cdots) \]

两边提取系数,得

\[a_n=B(n)-B(n-k)-B(n-2k)+B(n-5k)+B(n-7k)-\cdots \]

直接算,\(O(n\sqrt n)\) .

互异分拆数

题目描述

互异整数划分A000041

给一个正整数 \(n\),将 \(n\) 分为不同的若干个整数的和,问有多少种不同的划分方式,答案对 \(10^9+7\) 取模 .

提交通道:51nod #1201 整数划分.

前几项的互异分拆数:

\(n\) \(0\) \(1\) \(2\) \(3\) \(4\) \(5\) \(6\) \(7\) \(8\)
\(B^{\star}(n)\) \(1\) \(1\) \(1\) \(2\) \(2\) \(3\) \(4\) \(5\) \(6\)

解法

定义互异 \(k\) 部分拆数 \(\operatorname{dP}(n,k)\),表示最大拆出 \(k\) 个部分的互异分拆,不难发现就是

\[n-k=r_1+r_2+\cdots+r_k\quad\text{where }r_1>r_2>\cdots>r_k\ge 0 \]

的解数 .

发现由于互异,新方程中至多只有一个部分为零,有结论:恰有 \(j\) 个部分非零,则恰有 \(\operatorname{dP}(n-k,j)\) 个解(\(j=k,k-1\)),于是可以得到递推:

\[\operatorname{dP}(n,k)=\operatorname{dP}(n-k,k-1)+\operatorname{dP}(n-k,k) \]

直接算,时间复杂度 \(O(nk)\),可以滚动数组(滚 \(k\)).

实际上至多拆成的数数量是 \(O(\sqrt n)\) 的,所以时间复杂度还是 \(O(n\sqrt n)\) .

posted @ 2022-08-19 17:29  Jijidawang  阅读(68)  评论(1编辑  收藏  举报
😅​