##首先莫比乌斯反演入门_取值
我们来了解一下什么是莫比乌斯反演…

假设有两个函数莫比乌斯反演入门_取值_02,并且莫比乌斯反演入门_莫比乌斯反演_03
也就是

  • 莫比乌斯反演入门_取值_04
  • 莫比乌斯反演入门_莫比乌斯反演_05
  • 莫比乌斯反演入门_莫比乌斯反演_06
  • 莫比乌斯反演入门_取值_07
  • 莫比乌斯反演入门_莫比乌斯反演_08
  • 莫比乌斯反演入门_莫比乌斯反演_09
    .
    .
    .

莫比乌斯反演入门_取值_10莫比乌斯反演入门_数论_11的关系??
列一下

  • 莫比乌斯反演入门_取值_12
  • 莫比乌斯反演入门_取值_13
  • 莫比乌斯反演入门_取值_14
  • 莫比乌斯反演入门_数论_15
  • 莫比乌斯反演入门_数论_16
  • 莫比乌斯反演入门_取值_17
    .
    .
    .

???
继续列下去(本人过于懒惰
似乎莫比乌斯反演入门_取值_18
而且,这个莫比乌斯反演入门_莫比乌斯反演_19莫比乌斯反演入门_取值_20没有关系,而是和莫比乌斯反演入门_取值_21有关系

我们暂且将这个函数设为莫比乌斯反演入门_取值_22

并且这个函数的取值只有莫比乌斯反演入门_取值_23

光这么看很难发现这个函数的规律,然而我们的大数学家莫比乌斯发现了(不然怎么叫莫比乌斯反演)
式子是这样的

\begin{equation}
\mu(N)=
\begin{cases}
1 & N=1\
(-1)^m & N=P_1P_2P_3\cdots P_m\
0 & N=P_1{k_1}P_2{k_2}P_3^{k_3}\cdots P_m^{k_m},k_1+k_2+k_3+\cdots +k_m>m\
\end{cases}
\end{equation}

莫比乌斯反演入门_莫比乌斯反演_24是互不相等的质数,莫比乌斯反演入门_数论_25

第二条就是至少有一个莫比乌斯反演入门_取值_26

所以我们就有莫比乌斯反演入门_数论_27

这条式子也可以这么写莫比乌斯反演入门_取值_28

这个函数就是莫比乌斯函数
##证明?
首先,莫比乌斯函数有几个性质。

  • 性质一 莫比乌斯反演入门_取值_29
    莫比乌斯反演入门_数论_30
  • 性质二 莫比乌斯函数是积性函数莫比乌斯反演入门_莫比乌斯反演_31

先证性质一。
莫比乌斯反演入门_莫比乌斯反演_32时显然。

莫比乌斯反演入门_莫比乌斯反演_33
莫比乌斯反演入门_莫比乌斯反演_34莫比乌斯反演入门_取值_35有其中一部分。
显然莫比乌斯反演入门_取值_35的每个质因子指数为1才有贡献,否则莫比乌斯反演入门_取值_37

那么设莫比乌斯反演入门_取值_35中有莫比乌斯反演入门_莫比乌斯反演_39个质因子。
莫比乌斯反演入门_数论_40,这样的莫比乌斯反演入门_取值_35莫比乌斯反演入门_取值_42
所以莫比乌斯反演入门_取值_43

我们有二项式定理
莫比乌斯反演入门_数论_44
得证!

性质二似乎比较显然,此处不准备证明。
然后我们来证明反演。

莫比乌斯反演入门_数论_45

然后我们运用一种叫交换主体的等价变换,就是将后面的莫比乌斯反演入门_莫比乌斯反演_46移到前面来,这个似乎只能靠感觉,多练练就熟了。
下面直接是交换后的,想想为什么?
莫比乌斯反演入门_莫比乌斯反演_47
不急,因为我们有性质一
莫比乌斯反演入门_取值_48
莫比乌斯反演入门_数论_49
莫比乌斯反演入门_莫比乌斯反演_50
莫比乌斯反演入门_取值_51
综上
莫比乌斯反演入门_莫比乌斯反演_52得证!

##应用
然而莫比乌斯函数怎么求?
可以用线性筛法!

void getprime(int lim)
{
int i,j,num=0;
fo(i,2,lim)
{
if (!bz[i])
{
prime[++num]=i;
mu[i]=-1;//质数就是一个质因子
}
for(j=1;i*prime[j]<=lim&&j<=num;j++)
{
bz[i*prime[j]]=1;
if (prime[j]==i) break;
if (!(i%prime[j]))
{
mu[i*prime[j]]=0; //显然prime[j]在i*prime[j]中指数大于等于2
break;
}
mu[i*prime[j]]=-mu[i];//多加了一个质因子乘上-1
}
}
}

事实上,莫比乌斯反演还有个变形

莫比乌斯反演入门_取值_53

莫比乌斯反演入门_数论_54

证明类似上面的证法,此处不再赘述。若有兴趣着可以参考度娘。

它可以非常好的应用在一些问题,比如说

莫比乌斯反演入门_莫比乌斯反演_55不好求,但是莫比乌斯反演入门_莫比乌斯反演_56好求,可以设为莫比乌斯反演入门_莫比乌斯反演_57再用莫比乌斯反演解决。

##例题([HAOI2011][BZOJ2301]Problem b)

对于给出的n个询问,每次求有多少个数对(x,y),满足a≤x≤b,c≤y≤d,且gcd(x,y) = k,gcd(x,y)函数为x和y的最大公约数。

我们有这个
莫比乌斯反演入门_取值_58表示莫比乌斯反演入门_莫比乌斯反演_59莫比乌斯反演入门_取值_60对数

莫比乌斯反演入门_取值_61表示莫比乌斯反演入门_数论_62莫比乌斯反演入门_取值_60对数

那么显然有莫比乌斯反演入门_取值_53(此处我们假设莫比乌斯反演入门_莫比乌斯反演_65

莫比乌斯反演入门_取值_61非常好求,设莫比乌斯反演入门_莫比乌斯反演_67,那么只需要莫比乌斯反演入门_莫比乌斯反演_68

莫比乌斯反演入门_莫比乌斯反演_69

这里可能会超时,所以对于莫比乌斯反演入门_数论_70,可能有很多一部分是相等的,可以用分块解决,单次询问的复杂度就变成了莫比乌斯反演入门_取值_71
附代码

#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cmath>
#define fo(i,a,b) for(i=a;i<=b;i++)
#define fod(i,a,b) for(i=a;i>=b;i--)
using namespace std;
long long mu[50005];
int a,b,c,d,k;
int prime[50005],n;
bool bz[50005];
void getprime(int lim)
{
int i,j,num=0;
fo(i,2,lim)
{
if (!bz[i])
{
prime[++num]=i;
mu[i]=-1;
}
for(j=1;i*prime[j]<=lim&&j<=num;j++)
{
if (i*prime[j]>50000) break;
bz[i*prime[j]]=1;
if (prime[j]==i) break;
if (!(i%prime[j]))
{
mu[i*prime[j]]=0;
break;
}
mu[i*prime[j]]=-mu[i];
}
}
}
int find(int k,int mx,int my)
{
int i=1,j;
long long ans=0;
while(i<=trunc(min(mx,my)/k))
{
j=min(mx/(mx/i),my/(my/i));
ans+=trunc(my/(i*k))*trunc(mx/(i*k))*(mu[j]-mu[i-1]);
i=j+1;
}
return (int)ans;
}
int main()
{
freopen("inversion.in","r",stdin);
getprime(50000);
scanf("%d",&n);
mu[1]=1;
int i;
fo(i,2,50000) mu[i]+=mu[i-1];
while(n-->0)
{
scanf("%d%d%d%d%d",&a,&b,&c,&d,&k);
printf("%d\n",(int)(find(k,b,d)-find(k,a-1,d)-find(k,b,c-1)+find(k,a-1,c-1)));
}
}