zoukankan      html  css  js  c++  java
  • [题解](gcd/欧拉函数)luogu_P2568_GCD

    求gcd(x,y)=p等价于求gcd(x/p,y/p)=1,转化为了n/p内互质的个数

    所以欧拉函数,因为有序所以乘2,再特判一下只有在1,1情况下才会重复计算,所以每次都减一

    数组开小一时爽,提交wa火葬场!!!

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    using namespace std;
    const int maxn=10000009;
    int n;
    int ck[maxn],prime[maxn],phi[maxn],tot;
    long long sum[maxn];
    void eular(int n){
        phi[1]=1;
        for(int i=2;i<=n;i++){
            if(!ck[i]){
                ck[i]=i,prime[++tot]=i;
                phi[i]=i-1;
            }
            for(int j=1;j<=tot;j++){
                if(prime[j]>ck[i] || i*prime[j]>n)break;
                ck[prime[j]*i]=prime[j];
                phi[i*prime[j]]=phi[i]*(i%prime[j]?prime[j]-1:prime[j]);
            }
        }
    }
    int main(){
        scanf("%d",&n);
        eular(n);
        for(int i=1;i<=n;i++)sum[i]=sum[i-1]+phi[i];
        long long ans=0;
        for(int i=1;i<=tot;i++){
            ans+=2*sum[n/prime[i]]-1;
        }
        printf("%lld
    ",ans);
    }
  • 相关阅读:
    variables _ golang
    values _ golang
    hello world _ golang
    golang
    英语
    ubuntu下安装node、node代码调试
    xampp日常需求
    垂直居中方法总结
    angularJS之ui-router插件(1)
    Sass学习
  • 原文地址:https://www.cnblogs.com/superminivan/p/10864805.html
Copyright © 2011-2022 走看看