从昨天一直再看莫比乌斯反演,大体了解了过程,关于证明还是模模糊糊,也不会用,然后就暂时放弃了证明,接下来要看几道题,今天下午就再看《初等数论》,还没看多少,比想象中看的要慢一些。
说一下莫比乌斯反演,对于定义在两个正整数集合上的两个函数f(n)与F(n),有莫比乌斯反演公式如下:
公式一:F(n)=∑d|nf(d)=>f(n)=∑d|nμ(d)F(nd)
公式二:F(n)=∑n|df(d)=>f(n)=∑n|dμ(dn)F(d)
这里公式二比较常用。那么公式中的u(d)函数即是莫比乌斯函数,它的定义如下:
(1)若,那么
(2)若,均为互异素数,那么
(3)其它情况下
对于函数,它有如下的常见性质:
(1)对任意正整数有
(2)对任意正整数有
而且这里的莫比乌斯函数u(d)是一个积性函数,可以简单理解为对于μ(a),μ(b),当a与b互质时,μ(ab) = μ(a)μ(b)
有线性筛选求莫比乌斯函数:
void Init()
{
memset(vis,0,sizeof(vis));
mu[1]=1;
tot=0;
for(int i=2; i<N; i++)
{
if(!vis[i]) //对于一个新质数,u(i)=(-1)^1=-1;
{
prime[tot++] = i;
mu[i] = -1;
}
for(int j=0; j<tot&&i*prime[j]<N; j++)
{
vis[i*prime[j]] = 1;
if(i%prime[j]) //如果i不是prime[j]的整数倍,那么i*prime[j]就不会有相同的质因子
mu[i*prime[j]] = -mu[i]; //根据积性函数性质就有mu[i*prime[j]]=mu[i]*mu[prim[j]]=mu[i]*-1;
else
{
mu[i*prime[j]] = 0;
break;
}
}
}
}
比较经典的应用就是BZOJ 2820 ,题意大概是:给出n和m,求有多少对(x,y)(1<=x<=n,1<=y<=m)使得gcd(x,y)位质s数好吧,这题我还看不懂。但是大体知道莫比乌斯反演就是用来简化计算的,简化的就是函数f(n),那么问题就是在我们掌握了莫比乌斯反演之后怎么找函数F(n),f(n)。一般F(n)是可以直接求出来的,然后通过F(n)来求f(n).