前言:
题解在这位大佬这看的,写的好.
这道题给出了莫比乌斯反演在容斥上的一个应用。
题目大意:
给你一个长度为 n n n的数组 a i a_i ai,让你求出所有子集 S S S的贡献和: ∣ S ∣ ∗ g c d ( a i ∣ a i ∈ S ) ∗ [ g c d ( a i ∣ a i ∈ S ) ≠ 1 ] |S|*gcd(a_i\ |\ a_i\in S)*[gcd(a_i\ |\ a_i\in S)\neq1] ∣S∣∗gcd(ai ∣ ai∈S)∗[gcd(ai ∣ ai∈S)=1].
n ≤ 1 e 6 , a i ≤ 2 e 6 n \leq 1e6,a_i \leq 2e6 n≤1e6,ai≤2e6
题目思路:
有一个直接容斥的做法。类似我的 S O S d p SOSdp SOSdp博客中某道题一样。这里不展开。但是思想是类似的.
令 f ( k , d ) f(k,d) f(k,d)代表选出 k k k个数且 g c d = d gcd=d gcd=d的方案数.令 F ( k , d ) F(k,d) F(k,d)代表选出 k k k个数且都含有约数 d d d的方案数.
显然有 F ( k , d ) = ∑ d ∣ i f ( k , i ) F(k,d)=\sum_{d|i}^{}f(k,i) F(k,d)=∑d∣if(k,i)
这里直接反演: f ( k , d ) = ∑ d ∣ i μ ( i d ) F ( k , i ) f(k,d)=\sum_{d|i}^{}\mu(\frac id)F(k,i) f(k,d)=∑d∣iμ(di)F(k,i)
然后直接推导即可。