• 积性函数


    莫比乌斯反演

    莫比乌斯函数

    定义: 将 (x) 质因子分解分解 (x=p_{1}^{d_{1}}p_{2}^{d_{2}}p_{3}^{d_{3}}···p_{k}^{d_{k}}).

    [ mu (x)=left{ egin{array}{rcl} 0 & & exists d_{i}ge 2\ 1 & & x=1\ (-1)^k & & end{array} ight. ]

    莫比乌斯函数筛法:

    int pri[N],vis[N],Mobius[N],tot;
    void sieve_Mobius(int x)
    {
        vis[1]=Mobius[1]=1;
        for(register int i=2;i<=x;i++)
        {
            if(!vis[i])
            {
                pri[++tot]=i;
                Mobius[i]=-1;//质数只有一个质因子是他本身
            }
            for(register int j=1;j<=tot&&i*pri[j]<=x;j++)
            {
                vis[i*pri[j]]=1;
                if(!(i%pri[j]))
                {
                    Mobius[i*pri[j]]=0;//i*pri[j]里至少包含两个pri[j]
                    break;
                }
                Mobius[i*pri[j]]=-Mobius[i];//积性函数直接乘
            }
        }
    }
    

    性质1: 定义 (S(x)=sum_{dmid n}^{}mu (d)),则有:

    [S(n)=left{egin{matrix} 1 n=1\ 0 n>1\ end{matrix} ight.]

    证明:
    (n=1) 时,结论显然成立。

    (n=p_{1}^{alpha_{1}}p_{2}^{alpha_{2}}p_{3}^{alpha_{3}}···p_{k}^{alpha_{k}}) , 在 (n>1) 时,(kge 1).

    对于任意约数(d=p_{1}^{eta_{1}}p_{2}^{eta_{2}}p_{3}^{eta_{3}}···p_{k}^{eta_{k}}) , (0leeta_{i}lealpha_{i}).

    若存在 (eta_{i}ge 2) , 则有 (mu(d)=0).

    那么,若要使 (mu(d))(S(n)) 产生影响 , 则需满足 (forall eta_{i}in[0,1])

    故, (mu(d)) 的取值取决于 (eta_{i}=1) 的数量, 容易得到:

    [S(n)=sum_{i=0}^{k}inom{k}{i}(-1)^i ]

    由二项式定理可知:

    [(a+b)^k=sum_{i=0}^{k}inom{k}{i}a^{i}b^{k-i} ]

    (a=-1 , b=1) 代入得:

    [0^k=sum_{i=0}^{k}inom{k}{i}(-1)^{i}=S(n) ]

    证毕.

    莫比乌斯反演

    第一种形式

    定义在正整数域的两个函数 (F(n))(f(n)) , 若 (F(n)=sum_{dmid n}^{}f(d)) ,

    (f(n)=sum_{dmid n}{}mu (d)F(frac{n}{d})).

    证明:

    [egin{aligned} sum_{dmid n}{}mu (d)F(frac{n}{d})&=sum_{dmid n}{}mu (d)sum_{imid frac{n}{d}}{}f(i)\ &=sum_{imid n}{}f(i)sum_{dmid frac{n}{i}}{}mu (d)\ &=sum_{imid n}{}f(i)S(frac{n}{i}) 由上文可知,仅当i=n时S(frac{n}{i})=1,否则S(frac{n}{i})=0\ &= f(n) end{aligned}]

    证毕.

    第二种形式

    (F(n)=sum_{n mid d}{}f(d)) , 则 (f(n)=sum_{nmid d}{} mu (frac{d}{n})F(d)).
    证明:

    [egin{aligned} sum_{nmid d}{} mu (frac{d}{n})F(d)&=sum_{nmid d}{}mu (frac{d}{n})sum_{dmid i}{}f(i)\ &=sum_{nmid i}{}sum_{d'mid frac{i}{n}}{}mu (d') 设d'=frac{d}{n}\ &= sum_{nmid i}{}S(frac{i}{n})\ &=f(n) end{aligned}]

    证毕.

    problem b

    题解:设

    [F(k)=sum_{x=1}^{a}sum_{y=1}^{b}left [ k mid (x,y) ight ]=lfloorfrac{a}{k} floorlfloorfrac{b}{k} floor f(k)=sum_{x=1}^{a}sum_{y=1}^{b}left [ k = (x,y) ight ]]

    则有

    [F(k)=sum_{kmid d}{}f(d) ]

    由莫比乌斯反演定律可知:

    [egin{aligned} f(k)&=sum_{kmid d}{}mu(frac{d}{k})F(d)\ &=sum_{kmid d}{}mu(frac{d}{k})lfloorfrac{a}{d} floorlfloorfrac{b}{d} floor\ &=sum_{d'}{}mu(d')lfloorfrac{a'}{d'} floorlfloorfrac{b'}{d'} floor 设d'=frac{d}{k},a'=frac{a}{k},b'=frac{b}{k}. end{aligned}]

    等式右边 (lfloorfrac{a'}{d'} floorlfloorfrac{b'}{d'} floor) 可用整除分块计算。

    #include<bits/stdc++.h>
    #define N 100005
    #define LL long long 
    using namespace std;
    
    int t;
    LL a,b,c,d,k;
    
    inline int qr()
    {
        int x=0,w=1;char ch=0;
        while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
        while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
        return x*w;
    }
    
    int pri[N],vis[N],mobius[N],sum[N],tot;
    void sieve(int x)
    {
        mobius[1]=vis[1]=1;
        for(register int i=2;i<=x;i++)
        {
            if(!vis[i])
            {
                pri[++tot]=i;
                mobius[i]=-1;
            }
            for(register int j=1;j<=tot&&i*pri[j]<=x;j++)
            {
                vis[i*pri[j]]=1;
                if(!(i%pri[j]))
                {
                    mobius[i*pri[j]]=0;
                    break;
                }
                mobius[i*pri[j]]=-mobius[i];
            }
        }
        for(register int i=1;i<=x;i++)
            sum[i]=sum[i-1]+mobius[i];
    }
    
    inline LL f(int a,int b)
    {
        LL res=0;
        a=a/k,b=b/k;
        int n=min(a,b);
        int l=1,r=0;
        while(l<=n)
        {
            r=min(n,min(a/(a/l),b/(b/l)));
            res+=(LL)(sum[r]-sum[l-1])*(a/l)*(b/l);
            l=r+1;
        }
        return res;
    }
    
    int main()
    {
        //freopen("data.in","r",stdin);
        //freopen("data.out","w",stdout);
        sieve(50005);
        t=qr();
        while(t--)
        {
            a=qr();b=qr();c=qr();d=qr();k=qr();
            printf("%lld
    ",f(b,d)-f(a-1,d)-f(b,c-1)+f(a-1,c-1));
        }
        //system("pause");
        return 0;
    }
    
  • 相关阅读:
    anaconda 离线安装大包
    Openpose 安装问题解决
    Linux grep log文件及find命令学习
    整理了一些常用编程软件(方便自己下载)
    Docker安装es7.6和kibana7.6(并解决Unable to revive connection: http://192.168.162.139:9200/的问题)
    Jsr303分组校验和自定义注解校验
    Spring Cloud整合Oss
    Linux:vim
    Linux:挂载命令
    SpringBoot整合SpringSecurity:集中式项目
  • 原文地址:https://www.cnblogs.com/isonder/p/14397507.html
Copyright © 2020-2023  润新知