原理:
公式如下:
F(n)
f(n)
为定义在非负整数集合上的两个函数,并且满足
F(n)=∑d|nf(d)
,可以得到结论
f(n)=∑d|nu(d)F(nd)
上面公式中出现的函数
u(d)
为莫比乌斯函数,具有如下性质
u(d)=⎧⎩⎨1,−1,0,如果 d 是偶数个不同素数之积如果 d 是奇数个不同素数之积其他,即存在因数pak,a>1,p为素数
例如,因为 30=2∗3∗5 所以 u(30)=−1 又因为 121=112 ,则有 u(121)=0
对于
u(d)
有如下性质
∑d|nu(d)={1,0,if n=1if n>1
证明略(可以参考组合数学的教材)
对于任意整数n
∑d|nu(d)d=φ(n)n
证明略
获取莫比乌斯函数结果的代码为
const ll maxn=100001;
ll mu[maxn],prime[maxn],mark[maxn];
void Mobius()
{
mu[1]=1;
for(int i=2;i<maxn;i++)
{
if(!mark[i]){prime[++*prime]=i;mu[i]=-1;}
for(int j=1;i*prime[j]<maxn;j++)
{
mark[i*prime[j]]=1;
if(i%prime[j]==0)break;
mu[i*prime[j]]=-mu[i];
}
}
}
时间复杂度为O(n)
反演公式证明(latex写不动了=_=)
来自ppt
其中推到
f(n)
的 第一步是把
F(nd)
代入到
F(n)=∑d|nf(d)
当中 ,第二步是利用∑公式的性质,交换下标得到的。