关于莫比乌斯

Posted linda-fcj

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于莫比乌斯相关的知识,希望对你有一定的参考价值。

 

一、 $mu$的基本定义

 $mu(x)=$$egin{cases}1 (x=1)\\0   (x有平方因子)\\-1 (x有奇数个质因子)\\1 (x有偶数数个质因子) end{cases}$

 

二、相关性质

1、莫比乌斯反演常用:

$$sum_{d|n}mu(d)=[n=1]$$

2、把欧拉函数和莫比乌斯函数结合起来:

$$sum_{d|n}frac{mu(d)}{d}=frac{varphi(n)}{n}$$

 

三、莫比乌斯反演

1、倍数莫比乌斯反演:

若:$f(n)=sum_{n|d}g(d)$
则:$g(n)=sum_{n|d}mu(frac{d}{n})f(d)$

2、约数莫比乌斯反演:

若:$f(n)=sum_{d|n}g(d)$
则:$g(n)=sum_{d|n}mu(d)f(frac{n}{d})$

 

四、求$mu$

1、线性筛

void get_miu()
{
	miu[1]=1;
	for(int i=2;i<maxn;i++)
	{
		if(!mark[i])
		{
			p[++p[0]]=i;
			miu[i]=-1;
		}
		for(int j=1;j<=p[0] && i*p[j]<maxn;j++)
		{
			mark[i*p[j]]=1;
			if(i%p[j]==0)
			{
				miu[i*p[j]]=0;
				break;
			}
			else miu[i*p[j]]=-miu[i];
		}
	}
}

2、杜教筛求前缀和

 

技术分享图片

 

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <map> 
typedef long long ll;
using namespace std;
const int maxn=5e6+10;
ll a,b;
int miu[maxn],tot;
map<ll,ll> mp;

bool mark[maxn];
int p[maxn];

void init()
{
	miu[1]=1;
	for(int i=2;i<maxn;i++)
	{
		if(!mark[i])
		{
			p[++p[0]]=i;
			miu[i]=-1;
		}
		for(int j=1;j<=p[0] && i*p[j]<maxn;j++)
		{
			mark[i*p[j]]=1;
			if(i%p[j]==0)
			{
				miu[i*p[j]]=0;
				break;
			}
			else miu[i*p[j]]=-miu[i];
		}
	}
	for(int i=1;i<maxn;i++) miu[i]+=miu[i-1];
}

ll sum(ll x)
{
	if(x<maxn) return miu[x];
	if(mp.count(x)) return mp[x]; 
	ll r=0,res=1;
	for(long long i=2;i<=x;i=r+1)
	{
		r=x/(x/i);
		res-=sum(x/i)*(r-i+1);
	}
	return mp[x]=res; 
}

int main()
{
	init();
	scanf("%lld%lld",&a,&b);
	printf("%lld
",sum(b)-sum(a-1));	
	return 0;
}

  

 



以上是关于关于莫比乌斯的主要内容,如果未能解决你的问题,请参考以下文章

莫比乌斯反演·学习记录

莫比乌斯反演

莫比乌斯函数与杜教筛

莫比乌斯反演

莫比乌斯反演个人思考——关于problem b的三种推法。

莫比乌斯反演个人思考——关于problem b的三种推法。