很猎奇的转化,但是后面的计算就很简单了。
很难发现只有下面这种情况会重复。


设钦定出现 i 个情况的方案数为 f(i),那么显然有:
Ans=i=0∑min(n,m)(−1)i×f(i)
容易理解:
f(i)=(in)×(im)×i!×(n+1)m−i×(m+1)n−i
不妨设 n<m,那么:
d=1∑ni=1∑nj=1∑mμ2(d)[gcd(i,j)=d]
提出来:
d=1∑nμ2(d)i=1∑⌊dn⌋j=1∑⌊dm⌋[gcd(i,j)=1]
反演:
f(k)=i=1∑nj=1∑m[gcd(i,j)=k]
g(d)=d∣k∑f(k)=⌊dn⌋×⌊dm⌋
反演得到:
f(k)=k∣d∑μ(kd)×g(d)
所以:
f(1)=k=1∑nμ(k)×⌊kn⌋×⌊km⌋
带回去得到:
d=1∑nμ2(d)t=1∑⌊dn⌋μ(t)×⌊dtn⌋×⌊dtm⌋
设 T=dt 得到:
T=1∑n⌊Tn⌋×⌊Tm⌋d∣T∑μ2(d)×μ(dT)
手玩发现,当 T 为平方数是后面为 μ(T),否则为 0。
那么直接预处理 μ 的前缀和,在调用的时候调用 之后的值就行了。
考虑 O(n3) 怎么怎么解决,设 fi,j 表示节点 i 的子树之内有 j 个没有匹配。
那么为了把 i→fai 这条边覆盖,就需要在 i 这个子树中的节点至少有一个连接到这个子树之外的节点,所以有转移方程:
ffa(x),i+j−2k←ffa(i),i+j−2k+fx,i×ffa(x),j×(ki)×(kj)×k!
其中 k 就是选择要匹配的节点的数量,但是这个方法很没有前途。
VJO 曾经说过,正难则反,考虑容斥出答案。
设 F(S) 表示 S 这个集合中的边都钦定不选的方案数,那么根据容斥原理答案就是:
S⊆E∑(−1)∣S∣F(S)
容易理解其实有 S 这些边不被覆盖,就相当于把 S 里面的边删除然后在每个剩余的连通块里面乱连。
那么对于一个大小为 N 的连通块,我们记它乱连的方案数为 g(N),那么显然:
g(N)={0N×(N−2)×⋯×3×1N is odd.OtherWise.
设 fx,i 表示在以 x 为根的子树里,i 所在的连通块的大小,那么有转移方程:
ffa(x),i+j←ffa(x),i+j+fx,i×ffa(x),j
ffa(x),i←ffa(x),i−ffa(x),i×fx,j×g(j)
容易理解上面的转移分别代表 fa(x) 和 x 在一个连通块和 fa(x) 和 x 在两个连通块的情况。
最后的答案为 i=1∑nf1,i×g(i),时间复杂度为 O(n2)。
一直想做一直没做,原因是太难了而且上一次在哪里研究多项式科技耽误了很多时间。
把权值为 wi 的物品看作 wi 个权值为 1 的物品,对于 ∣S∣ 的可以看作对 S 中所有的元素都贡献了 1。
那么对于自己给自己的贡献,显然是 {nk}。
对于别人给自己的贡献显然是 {n−1k}。
所以答案为:
({nk}+(n−1)×{n−1k})×i=1∑nwi
时间复杂度为 O(nlogV),另外斯特林数用通项公式处理。