zoukankan      html  css  js  c++  java
  • 51nod 1244 莫比乌斯函数之和 【莫比乌斯函数+杜教筛】

    和bzoj 3944比较像,但是时间卡的更死
    设( f(n)=sum_{d|n}mu(d) g(n)=sum_{i=1}^{n}f(i) s(n)=sum_{i=1}^{n}mu(i) ),然后很显然对于mu( g(n)=1),对于( g(n)=n*(n+1)/2 ),然后可以这样转化一下:

    [g(n)=sum_{i=1}^{n}sum_{d|n}mu(d) ]

    [=sum_{d=1}^{n}mu(d)left lfloor frac{n}{d} ight floor ]

    [=sum_{d=1}^{n}s(left lfloor frac{n}{d} ight floor) ]

    [s(n)=g(n)-sum_{d=2}^{n}s(left lfloor frac{n}{d} ight floor) ]

    然后递归求解即可。

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    using namespace std;
    const long long N=5000005,m=4500000;
    long long mb[N],tot,q[N],p[N];
    long long l,r;
    bool v[N];
    long long getp(long long x,long long n)
    {
    	return (x<=m)?mb[x]:p[n/x];
    }
    void slv(long long x,long long n)
    {
    	if(x<=m)
    		return;
    	long long t=n/x;
    	if(v[t])
    		return;
    	v[t]=1;
    	p[t]=1;
    	for(long long i=2,la;la<x;i=la+1)
    	{
    		la=x/(x/i);
    		slv(x/i,n);
    		p[t]-=getp(x/i,n)*(la-i+1);
    	}
    }
    long long wk(long long n)
    {
    	if(n<=m)
    		return mb[n];
    	memset(v,0,sizeof(v));
    	slv(n,n);
    	return p[1];
    }
    int main()
    {
    	mb[1]=1;
    	for(long long i=2;i<=m;i++)
    	{
    		if(!v[i])
    		{
    			q[++tot]=i;
    			mb[i]=-1;
    		}
    		for(long long j=1;j<=tot&&i*q[j]<=m;j++)
    		{
    			long long k=i*q[j];
    			v[k]=1;
    			if(i%q[j]==0)
    			{
    				mb[k]=0;
    				break;
    			}
    			mb[k]=-mb[i];
    		}
    	}
    	for(long long i=1;i<=m;i++)
    		mb[i]+=mb[i-1];
    	scanf("%lld%lld",&l,&r);
    	printf("%lld
    ",wk(r)-wk(l-1));
    	return 0;
    }
    
  • 相关阅读:
    CentOS 添加sudo 用户
    CentOS 7 Hostname
    Java 两线程交替打印奇偶数(一)
    Angular2 Forms
    Built-in Components
    How Angular Works
    数字签名算法
    不对称加密算法
    对称加密算法
    消息摘要算法
  • 原文地址:https://www.cnblogs.com/lokiii/p/8334589.html
Copyright © 2011-2022 走看看