码迷,mamicode.com
首页 > 其他好文 > 详细

莫比乌斯反演

时间:2018-08-10 11:00:11      阅读:184      评论:0      收藏:0      [点我收藏+]

标签:limit   iostream   lin   质因数   while   rac   isp   正整数   ==   

莫比乌斯反演

定理:

 F(n)和f(n)是在非负整数集合上的两个函数,并且满足条件F(n)=\(\sum\limits_{d|n}f(d)\),那么就可以得出结论:\[f(n)=\sum\limits_{d|n}μ(d)F(\frac{n}{d})\]

 其中μ是莫比乌斯函数:

 (1)如果x=1 μ(x)=1

 (2)如果x的质因数的次数都为1,μ(x)=(-1)k k表示x的质因数个数

 (3)其他情况下 μ(x)=0

莫比乌斯函数的性质:

 (1)对于任意正整数n有

 \[\sum\limits_{d|n}μ(d)=[n==1]\]

 (2)对于任意正整数n有

 \[\sum\limits_{d|n}\frac{μ(d)}{d}=\frac{φ(n)}{n}\]

线性筛莫比乌斯函数:

#include<cstdio>
#include<iostream>
using namespace std;
const int N=100000;
int mu[N],vis[N],dis[N],n;
void get_mu()
{
    mu[1]=1;
    int cnt=0;
    for(int i=2;i<=n;++i)
    {
        if(!vis[i])
        {
            dis[++cnt]=i;
            mu[i]=-1;
        }
        for(int j=1;j<=cnt&&i*dis[j]<=n;++j)
        {
            vis[i*dis[j]]=1;
            if(i%dis[j]) mu[i*dis[j]]=-mu[i];
            else
            {
                mu[i*dis[j]]=0;
                break;
            }
        }
    }
}
int main()
{
    scanf("%d",&n);
    get_mu();
    for(int i=1;i<=n;++i)
        printf("%d ",mu[i]);
    return 0;
}

证明:

例题:

hdu2588
\[\sum\limits_{i=1}^n{(i,n)>=m}\]
\[=\sum\limits_{d|n,d>=m}\sum\limits_{i=1}^n{(\frac{i}{d},\frac{n}{d})=1}\]
\[=\sum\limits_{d|n,d>=m}\sum\limits_{k=1}^\frac{n}{d}{(k,\frac{n}{d})=1}\]
\[=\sum\limits_{d|n,d>=m}{φ(\frac{n}{d})}\]

#include<cstdio>
#include<iostream>
#include<cmath>
using namespace std;
int n,m;
typedef long long ll;
ll phi(int x)
{
    if(x==1) return 1;
    ll ans=1;
    int qq=sqrt(x);
    for(int i=2;i<=qq&&x!=1;++i)
    {
        if(x%i==0)
        {
            ans=ans*(i-1);
            x/=i;
        }
        while(x%i==0)
        {
            ans=ans*i;
            x/=i;
        }
    }
    if(x!=1) ans=ans*(x-1);
    return ans;
}
int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        ll  ans=0;
        scanf("%d%d",&n,&m);
        int k=sqrt(n);
        for(int i=1;i<=k;++i)
        {
            if(n%i==0)
            {
                if(n/i>=m&&i!=n/i)
                ans+=phi(i);
                if(i>=m)
                ans+=phi(n/i);
            }
        }
        cout<<ans<<endl;
    }
    return 0;
}

莫比乌斯反演

标签:limit   iostream   lin   质因数   while   rac   isp   正整数   ==   

原文地址:https://www.cnblogs.com/wxyww/p/9452794.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!