zoukankan      html  css  js  c++  java
  • Gcd(bzoj 2818)

    Description

    给定整数N,求1<=x,y<=N且Gcd(x,y)为素数的
    数对(x,y)有多少对.

    Input

    一个整数N

    Output

    如题

    Sample Input

    4

    Sample Output

    4

    HINT

    hint

    对于样例(2,2),(2,4),(3,3),(4,2)


    1<=N<=10^7

    /*
        根据gcd(x,y)=p,得到gcd(x/p,y/p)=1 
        先枚举所有素数p,然后枚举p的倍数x,利用欧拉函数求出y的个数。
        直接计算欧拉函数会超时,可以预处理出来。 
    */
    #include<cstdio>
    #include<iostream>
    #define N 10000010
    using namespace std;
    int prime[N],f[N],euler[N],n,num;
    void get_prime(){
        for(int i=2;i<=n;i++){
            if(!f[i]) prime[++num]=i;
            for(int j=1;j<=num;j++){
                if(i*prime[j]>n) break;
                f[prime[j]*i]=1;
                if(i%prime[j]==0) break;
            }
        }
    }
    void get_euler(){
        for(int i=1;i<=n;i++) euler[i]=i;
        for(int i=2;i<=n;i++){
            if(euler[i]==i){
                for(int j=i;j<=n;j+=i)
                    euler[j]=euler[j]/i*(i-1);
            }
        }
    }
    int oula(int x){
        int ans=x;
        for(int i=2;i*i<=x;i++){
            if(x%i==0){
                ans-=ans/i;
                while(x%i==0) x/=i;
            }
        }
        if(x>1) ans-=ans/x;
        return ans;
    }
    int main(){
        scanf("%d",&n);
        get_prime();get_euler();
        long long ans=0;
        for(int i=1;i<=num;i++){
            int p=prime[i];long long tot=0;
            for(int j=p;j<=n;j+=p)
                tot+=(long long)euler[j/p];
            ans+=tot*2-1;
        }
        cout<<ans;
        return 0;
    }
  • 相关阅读:
    子程序定义-3
    子程序定义-2
    子程序定义-1
    MQ报 AMQ9259
    观nginx与lvs负载均衡的较量
    绑定变量值长度不一致,mismatch问题
    perl-printf 函数
    perl 运算符
    强制让SQL走谓词推入
    PGA概念
  • 原文地址:https://www.cnblogs.com/harden/p/6517213.html
Copyright © 2011-2022 走看看