日记
我们设 dpi 表示 i 个点能组成多少种 DAG。我们发现:一个 DAG 去掉入度为 0 的点一定还是 DAG。我们枚举有 j 个入度为 0 d 点,有转移:
dpi=j=1∑idpi−j×2j×(i−j)×(ji)这三项分别表示:子图的方案数;总共有 j×(i−j) 条备选边,每条边都可以选择取或者不取;i 里取 j 个作为入度为 0 的点的方案数。
但是我们发现:这并非恰好 j 个入度为 0 的点,所以我们需要二项式反演,边转移边反演:
dpi=j=1∑i(−1)j×dpi−j×2j×(i−j)×(ji)最终的答案就是 dpn。
讨厌 pdf 英文题面。
我们首先想到一个简单容斥(但我没想到):
ans=i=1∑n(−1)i×fi,j×gm−j其中 fi,j 表示用 i 个集合里的数和为 j 的方案数,gi 表示随便乱凑 i 的方案数。显然,fi,j 可以 O(nm) 预处理,但是这样我们计算答案就变成了 O(n2m),显然不行,于是我们把 ∑i=1n(−1)i×fi,j 一整个并到 fj 里去,转移就变成了 fj←fj−fj−i。
现在考虑如何求解 gi。有简单的完全背包做法,但是复杂度是 O(m2),显然过不了。考虑根号分治。对于 i≤m 的 gi,我我们直接暴力完全背包,复杂度 O(m)。对于 >m 的,我们设 αi,j 表示凑出 i×m+j 的方案数。有转移:αi,j=αi,j−1+αi−1,j−1。分别表示:加入一个 1,整体 +1,这样就能够凑出所有的方案了。把 αi,j 加到 gi×m+j 上就是了。
设 n≤m,有:
ans=i=1∏nj=1∏mFgcd(i,j)=d=1∏nFk∑i=1n∑j=1m[gcd(i,j)=k]指数上那一坨掏出来:
i=1∑nj=1∑m[gcd(i,j)=k]=i=1∑⌊kn⌋j=1∑⌊km⌋[gcd(i,j)=1]=i=1∑⌊kn⌋j=1∑⌊km⌋d∣gcd(i,j)∑μ(d)=d=1∑ni=1∑⌊kdn⌋j=1∑⌊kdm⌋μ(d)=d=1∑nμ(d)⌊kdn⌋⌊kdm⌋代回原式:
ans=k=1∏nFk∑d=1nμ(d)⌊kdn⌋⌊kdm⌋枚举 kd=t:
ans=k=1∏nFk∑d=1nμ(d)⌊kdn⌋⌊kdm⌋=t=1∏nk∣t∏Fkμ(kt)⌊kdn⌋⌊kdm⌋设 fn=∏k∣nFkμ(kn),可以 O(nlogn) 暴力预处理,外层直接数论分块。注意快速幂的复杂度。
心情不好不想谈。
也许我练了这么久水平也还是有提升的?