莫比乌斯反演
当满足以下求和函数:
可以得到:
F(1)=f(1) F(2)=f(1)+f(2)
F(3)=f(1)+ f(3) F(4)=f(1)+f(2)+f(4) F(5)=f(1)+f(5)
推出:
f(1)=F(1) f(2)=F(2)-f(1)=F(2)-F(1)
f(3) =F(3)-F(1) f(4)=F(4) -f(2)- f(1) =F(4)-F(2)
f(5) =F(5)-F(1)
可以反推出求f(x)的式子:
在上面的公式中有一个函数,它的定义如下:
(1)若,那么
(2)若,
均为互异素数,那么
(3)其它情况下
而函数可以通过筛选求出:
然后是关于莫比乌斯求GCD的原理,当时看了很久感觉并无法满足上面公式,后来才发现还有公式2(╯▽╰)

即F[n]等于n的倍数d,f[d]的和,然后可以反演出后面公式
对于GCD(x,y) = k
设f[d]: GCD(x,y) = k ,即最大公约数为k的(x,y)的对数
F[n]: n|GCD(x,y) ,即最大公约数是n的倍数的(x,y)的对数
所以:F{1] = f[1] + .... + f[n]
F[2] = f[2] + f[4] + ....f[2*i]...
可以发现完全满足上面的公式
而且对于F[n],可以求出F[n] = (a/n)*(b/n)
因此我们可以再利用反演求f[d]
void Moblus()
{
tot = 0;
memset(is_prime,0,sizeof(is_prime));
mu[1] = 1;
for(int i = 2; i <= maxn; i++)
{
if(!is_prime[i])
{
prime[tot++] = i;
mu[i] = -1;
}
for(int j = 0; j < tot; j++)
{
if(prime[j]*i>maxn)
break;
is_prime[i*prime[j]] = 1;
if(i % prime[j]) //prime[j]不重复
{
mu[i*prime[j]] = -mu[i];
}
else
{
mu[i*prime[j]] = 0;
break;
}
}
}
}