zoukankan      html  css  js  c++  java
  • 【BZOJ 2818】gcd 欧拉筛

    枚举小于n的质数,然后再枚举小于n/这个质数的Φ的和,乘2再加1即可。乘2是因为xy互换是另一组解,加1是x==y==1时的一组解。至于求和我们只需处理前缀和就可以啦,注意Φ(1)的值不能包含在前缀和里,因为这样就会把x==y==1的情况算2次了,,,貌似包含后只要乘2再减1就可以了

    #include<cstdio>
    using namespace std;
    const int N=10000003;
    int num=0,prime[N],phi[N];
    long long sum[N];
    bool notp[N];
    inline void shai(int n){
        phi[1]=1;
        for(int i=2;i<=n;++i){
            if (!notp[i]){
                prime[++num]=i;
                phi[i]=i-1;
            }
            for(int j=1;j<=num&&i*prime[j]<=n;++j){
                notp[i*prime[j]]=1;
                if (i%prime[j]==0){
                    phi[i*prime[j]]=phi[i]*prime[j];
                    break;
                }else
                    phi[i*prime[j]]=phi[i]*phi[prime[j]];
            }
            sum[i]=sum[i-1]+phi[i];
        }
    }
    int main(){
    	long long ans=0;
    	int n;
    	scanf("%d
    ",&n);
    	shai(n);
    	for(int i=1;i<=num;++i){
    		if (n/prime[i]==0)
    			break;
    		ans+=2*sum[n/prime[i]];
    		ans++;
    	}
    	printf("%lld
    ",ans);
        return 0;
    }
    

    然后就行啦

  • 相关阅读:
    怎么删除json 键值对
    解决html 图片缓存问题
    美工常用的网站分享
    小程序授权页面
    BitMap原理
    css页面加载动画
    可能这些是你想要的H5软键盘兼容方案
    关于范式 :1NF 2NF 3NF等
    Python3学习DAY4
    DTD相关
  • 原文地址:https://www.cnblogs.com/abclzr/p/5299362.html
Copyright © 2011-2022 走看看