hdu 5072 莫比乌斯反演

来源:互联网 发布:c语言实现贪吃蛇 编辑:程序博客网 时间:2024/05/16 09:59
hdu 5072 莫比乌斯反演
题意:
给出n个数a1,a2,...,an, 从中选出三个数a,b,c,且这三个数符合[(a,b)=(b,c)=(a,c)=1] || [(a,b)!=1 && (b,c)!=1 && (a,c)!=1] 其中(x,y)表示x,y的最大公约数。求符合这个条件的三元组的个数。

限制:
3 <= n <= 1e5; 1 <= ai <= 1e5

思路:
设bi为与ai互质的数的个数,则符合条件 !(((a,b)=(b,c)=(a,c)=1) || ((a,b)!=1 && (b,c)!=1 && (a,c)!=1)) 的三元组的个数为:
t=(sigma(1~n)bi*(n-1-bi))/2
可以看到C(n,3)-t即为答案。
下面证明上面式子的由来:
对于任意符合条件的a,b,c有以下6种情况:
1. (a,b)=1 && (a,c)!=1 && (b,c)=1
2. (a,b)=1 && (a,c)!=1 && (b,c)!=1
3. (a,b)!=1 && (a,c)=1 && (b,c)=1
4. (a,b)!=1 && (a,c)=1 && (b,c)!=1
5. (a,b)=1 && (a,c)=1 && (b,c)!=1
6. (a,b)!=1 && (a,c)!=1 && (b,c)=1
我们可以发现bi*(n-1-bi)只覆盖了上面的1~4的情况,但我们又发现剩下两种情况可以由b或c来覆盖
其实对于1~6的情况,每种情况都被覆盖了两遍
1. 被a,c覆盖
2. 被a,b覆盖
...
所以是所有的加起来/2

然后问题就被化简为对于每个数,在复杂度内求和它互质的数的个数,这个可以用容斥做,也可以用莫比乌斯反演来做
对于一个给定的数x0
设f(k)为gcd(x0,x)=k的x的数目
设F(k)为gcd(x0,x)为k的倍数的x的数目,然后发现F(k)为拥有因子k的ai的数目,这个可以用O(sqrt(ai))枚举因子预处理出来。


0 0
原创粉丝点击