CF839D Winter is here

题目分析

显然我们不可能直接计算每一个子序列的贡献,而应该计算对于每一个gcd对答案的贡献。

考虑容斥。按照套路:

(q(i))表示序列(gcd)(i)的倍数的序列长度和。

(g(i))表示序列(gcd)(i)的序列对答案的贡献。

(f(i))表示序列(gcd)(i)的序列的容斥系数。

对于(q(i)),显然我们可以利用调和级数在(O(nlogn))的时间复杂度下求出(gcd)(i)的数的个数。
那么它们形成的子序列的长度和为:(sumlimits_{i=0}^ni*dbinom{n}{i}=n* 2^{n-1})

对于(g(i)),本题中显然(g(i)=i)

对于(f(i)),我们按照套路可以得到:(g(x)=sumlimits_{d|x}f(d))
这个十分显然的可以直接上莫比乌斯反演。于是得到: (f(x)=sumlimits_{d|x}mu(frac{x}{d})g(d))
这个也很容易利用调和级数在(O(nlogn))的时间复杂度下计算出来。

于是最终答案即为:(sumlimits_{i=2}^{10^6}q(i)* f(i))

原文地址:https://www.cnblogs.com/Trrui/p/9978088.html