zoukankan      html  css  js  c++  java
  • BZOJ4805: 欧拉函数求和

    BZOJ4805: 欧拉函数求和

    Description

    给出一个数字N,求sigma(phi(i)),1<=i<=N

    Input

    正整数N。N<=2*10^9

    Output

    输出答案。

    Sample Input

    10

    Sample Output

    32

    题解Here!

    题目要求:$$sum_{i=1}^nvarphi(i)$$
    这。。。不是很显然一个线性筛然后前缀和就没了么?
    水题?
    并不!
    $Nleq 2 imes 10^9$!
    直接$TLE$到爆炸。。。
    怎么办?
    没事,我们有杜教筛!
    具体的可以看这个板子题:

    BZOJ3944: Sum

    然后一发模板就可以了。

    附代码:

    #include<iostream>
    #include<algorithm>
    #include<cstdio>
    #include<map>
    #define MAXN 1700010
    using namespace std;
    map<int,long long> sum;
    int k=0,prime[MAXN],mu[MAXN];
    bool np[MAXN];
    inline long long read(){
    	long long date=0;char c=0;
    	while(c<'0'||c>'9')c=getchar();
    	while(c>='0'&&c<='9'){date=date*10+c-'0';c=getchar();}
    	return date;
    }
    void make(){
    	int m=MAXN-10;
    	mu[1]=1;
    	for(int i=2;i<=m;i++){
    		if(!np[i]){
    			prime[++k]=i;
    			mu[i]=-1;
    		}
    		for(int j=1;j<=k&&prime[j]*i<=m;j++){
    			np[prime[j]*i]=true;
    			if(i%prime[j]==0)break;
    			mu[prime[j]*i]=-mu[i];
    		}
    	}
    	for(int i=2;i<=m;i++)mu[i]+=mu[i-1];
    }
    long long solve_mu(long long n){
    	if(n<=MAXN-10)return mu[n];
    	if(sum.count(n))return sum[n];
    	long long ans=1;
    	for(long long i=2,last;i<=n;i=last+1){
    		last=n/(n/i);
    		ans-=1LL*(last-i+1)*solve_mu(n/i);
    	}
    	sum[n]=ans;
    	return ans;
    }
    long long solve_phi(long long n){
    	long long ans=0;
    	for(int i=1,last;i<=n;i=last+1){
    		last=n/(n/i);
    		ans+=1LL*(n/i)*(n/i)*(solve_mu(last)-solve_mu(i-1));
    	}
    	return (((ans-1)>>1)+1);
    }
    int main(){
    	long long n=read();
    	make();
    	printf("%lld
    ",solve_phi(n));
    	return 0;
    }
    
  • 相关阅读:
    win10 uwp 异步进度条
    win10 uwp 异步进度条
    win10 uwp 简单MasterDetail
    win10 uwp 简单MasterDetail
    如何使用PHP验证客户端提交的表单数据
    PHP 表单和用户输入讲解
    什么是PHP 面向对象
    PHP 命名空间(namespace)定义
    PHP 魔术常量介绍
    archer 安装
  • 原文地址:https://www.cnblogs.com/Yangrui-Blog/p/9939678.html
Copyright © 2011-2022 走看看