题意
给出一个可重集 \(S\),值为 \(i\) 的元素有 \(freq_i\) 个
有两个集合 \(A,B\) 满足
- \(B\subset A\subseteq S\)
- \(|B|=|A|-1\)
- \(\gcd_{x\in A}x=1\)
称这两个集合的权值 \(w(A,B)=\sum\limits_{x\in A}x\sum\limits_{y\in B}y\)
求所有可能的集合对 \((A, B)\) 的权值之和
\(1\le a_i\le10^5,freq_i\le10^9\)
题解
\(\gcd_{x\in A}x=1\) 是一个棘手的条件
考虑令 \(f_i\) 表示满足 \(\gcd_{x\in A}x=i\) 时的答案,\(g_i\) 表示满足 \(i\mid\gcd_{x\in A}x\) 时的答案
有 \(g_i=\sum\limits_{i\mid j}f_j\)
求出 \(g\) 以后,可以莫比乌斯反演得到 \(f\)
即 \(f_i=\sum\limits_{j\mid i}\mu(j)\times g_j\)
所以答案 \(\text{Ans}=\sum\limits_{1\le i}\mu(i)\times g_i\)
接下来考虑求 \(g_i\)
先构造集合 \(S'=\{x|x\in S,i\mid x\}\)
有
我们考虑每一对 \((x\in A, y\in B)\) 对 \(g_i\) 的贡献
称在集合 \(A\) 中但不再集合 \(B\) 中的元素为特殊元素,在集合 \(A\) 和 \(B\) 中的为普通元素
分两种情况讨论:
- \(x, y\) 是同一个元素
显然 \(x\) 是普通元素
那么我们从剩下 \(|S'|-1\) 个元素中选出一个特殊元素,再从剩下的 \(|S'|-2\) 个元素中任选若干个作为普通元素
有 \((|S'|-1)\times 2^{|S'|-2}\) 种方案,产生 \((|S'|-1)\times 2^{|S'|-2}\times x^2\) 的贡献 - \(x, y\) 是不同的元素,注意是元素不同,不是值不同
显然 \(y\) 是普通元素
若 \(x\) 是普通元素,类似的有 \((|S'|-2)\times 2^{|S'|-3}\) 种方案
若 \(x\) 是特殊元素,在剩下的 \(|S'|-2\) 个元素中任选作为普通元素,有 \(s^{|S'|-2}\) 种方案
共 \((|S'|-2)\times 2^{|S'|-3}+s^{|S'-2|}\) 种方案,产生贡献 \([(|S'|-2)\times 2^{|S'|-3}+s^{|S'|-2}]\times x\times y\)
回到本题,我们把值相同的元素放在一起考虑
相同值 \(x\) 之间的贡献有两种
- 同元素
套用上面同元素的贡献,乘上值为 \(x\) 的元素个数即可
即有贡献 \((|S'|-1)\times 2^{|S'|-2}\times x^2\times freq_x\) - 不同元素
套用上面不同元素的贡献
即有贡献 \([(|S'|-2)\times 2^{|S'|-3}+s^{|S'|-2}]\times x^2\times freq_x\times (freq_x-1)\)
不同的值 \(x, y\) 之间的贡献
类似的 \([(|S'|-2)\times 2^{|S'|-3}+s^{|S'|-2}]\times x\times y\times freq_x\times freq_y\)
直接求 \(\sum\limits_{x,y\in S',x\not =y}[(|S'|-2)\times 2^{|S'|-3}+s^{|S'|-2}]\times x\times y\times freq_x\times freq_y\) 显然时间上不能接受
稍稍转化一下
\[\begin{align*} &\sum_{x,y\in S',x\not =y}[(|S'|-2)\times 2^{|S'|-3}+s^{|S'|-2}]\times x\times y\times freq_x\times freq_y\\ =&[(|S'|-2)\times 2^{|S'|-3}+s^{|S'|-2}]\sum_{x,y\in S',x\not =y}x\times freq_x\times y\times freq_y\\ =&[(|S'|-2)\times 2^{|S'|-3}+s^{|S'|-2}][(\sum_{x\in S'}x\times freq_x)^2-\sum_{x\in S'}(x\times freq_x)^2] \end{align*}\]至此我们的到了一个调和级数时间复杂度的算法,即 \(\Theta(n\log n)\)
细节
计算 \(|S'|\) 时不要直接模 \(998244353\),因为它要放在指数上
代码 codeforces submission 144913462