zoukankan      html  css  js  c++  java
  • bzoj 2818

    2818: Gcd

    Time Limit: 10 Sec  Memory Limit: 256 MB
    Submit: 6814  Solved: 3005
    [Submit][Status][Discuss]

    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

    Source

    代码:
    //两个互质的数的gcd=1,所以他们同时乘一个素数那么他们的gcd=这个素数,所以枚举素数p找n/p以内有多少对互质数
    //用欧拉函数。
    #include<iostream>
    #include<cstdio>
    #include<cstdio>
    using namespace std;
    typedef long long ll;
    const int MAXN=10000009;
    int phi[MAXN],prime[MAXN];
    ll f[MAXN];
    int tot;
    void get_phi()
    {
        phi[1]=1;
        for(int i=2;i<=MAXN-9;i++){
            if(!phi[i]){
                phi[i]=i-1;
                prime[++tot]=i;
            }
            for(int j=1;j<=tot&&1LL*i*prime[j]<=MAXN-9;j++){
                if(i%prime[j]) phi[i*prime[j]]=phi[i]*(prime[j]-1);
                else{
                    phi[i*prime[j]]=phi[i]*prime[j];
                    break;
                }
            }
        }
    }
    int main()
    {
        int n;
        scanf("%d",&n);
        get_phi();
        f[1]=1;
        for(int i=2;i<=MAXN-9;i++) f[i]=f[i-1]+phi[i]*2;
        ll ans=0;
        for(int i=1;i<=tot&&prime[i]<=n;i++){
            int tmp=n/prime[i];
            ans+=f[tmp];
        }
        printf("%lld
    ",ans);
        return 0;
    }
  • 相关阅读:
    第24课 #pragma使用分析
    第23课 #error和#line使用分析
    第22课 条件编译使用分析
    第21课 宏定义与使用分析
    Codeforces Round #142 (Div. 2)B. T-primes
    SPOJ XMAX
    Uva 10036
    Timus 1009. K-based Numbers
    MBLAST
    ROADS
  • 原文地址:https://www.cnblogs.com/--ZHIYUAN/p/8010672.html
Copyright © 2011-2022 走看看