莫比乌斯函数,它的定义如下:
(1)若,那么
(2)若,均为互异素数,那么
(3)其它情况下
莫比乌斯函数是一个数论函数,它同时也是一个积性函数(i.e.μ(ab) =μ(a)μ(b), a,b互质)
当n不等于1时,n所有因子的莫比乌斯函数值的和为0,
莫比乌斯函数计算模板:
O(nlogn)
void getMu(){
int N=maxn;
for(int i=1;i<N;++i){
int target=i==1?1:0;
int delta=target-mu[i];
mu[i]=delta;
for(int j=2*i;j<N;j+=i)
mu[j]+=delta;
}
}
O(n)
#define MAXN 101
bool vis[MAXN];
int primes[MAXN];
int miu[MAXN];
void calc(int limit)
{
memset(vis, false, sizeof(vis));
memset(miu, 0, sizeof(miu));
int tot = 0;
miu[1] = 1; //根据定义,μ(1) = 1
for(int i = 2; i <= limit; i++)
{
if(!vis[i]) //未发现的质数
{
primes[tot++] = i;
miu[i] = -1;
//质数,除了1以外,只有它自己是自己的质因数
//因此根据定义,μ(i) = (-1)^1 = -1
}
for(int j = 0; j < tot; j++)
{
int k = i*primes[j];
if(k > limit)break;
vis[k] = true;
if(i % primes[j]) //i不是primes[j]的整数倍时,i*primes[j]就不会包含相同质因子。
miu[k] = -miu[i]; //此时根据其积性函数的特性得 miu[k] = miu[i]*miu[primes[j]],因为primes[j]是质数,miu值为-1
else //然后化简得miu[k] = -miu[i]; (perfect!)
break;
}
}
}
莫比乌斯反演:
这两种都是莫比乌斯反演的表示方法。
莫比乌斯反演的应用:
对于类似于莫比乌斯反演的求和函数
一般我们可以用O(1) 时间求得F(i),但f(i)可能要用O(n*n)的时间去求,乃至更多。
这时我们就可以用莫比乌斯反演(或变形),得