zoukankan      html  css  js  c++  java
  • P2568 GCD

    题目描述

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

    输入输出格式

    输入格式:

    一个整数N

    输出格式:

    答案

    输入输出样例

    输入样例#1: 复制
    4
    输出样例#1: 复制
    4

    说明

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

    1<=N<=10^7

    来源:bzoj2818

    本题数据为洛谷自造数据,使用CYaRon耗时5分钟完成数据制作。

    //首先我们枚举gcd(x,y)=p的p,那么gcd(x/p,y/p)肯定互质,
    //也就是求在[1,n/p]范围内的欧拉函数的前缀和,再乘2,因为x和y可以交换,
    //然后在减去1,因为(1,1)的情况被算了两次 
    
    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<cmath>
    #include<algorithm>
    using namespace std;
    
    const int N=1e7+5;
    
    int phi[N];
    int prime[N],cnt;
    bool flag[N];
    void init(int n)
    {
        int d;
        phi[1]=1;
        for(int i=2;i<=n;++i)
        {
            if(!flag[i])
                prime[++cnt]=i,phi[i]=i-1;
            for(int j=1;j<=cnt&&(d=i*prime[j])<=n;++j)
            {
                flag[d]=1;
                if(i%prime[j])
                    phi[d]=phi[i]*(prime[j]-1);
                else
                    phi[d]=phi[i]*prime[j];
            }
        }
    }
    
    int n;
    long long ans;
    long long sum[N];
    int main()
    {
        scanf("%d",&n);
        init(n);
        for(int i=1;i<=n;++i)
            sum[i]=sum[i-1]+1ll*phi[i];
        for(int i=1;i<=cnt&&prime[i]<=n;++i)
            ans+=sum[n/prime[i]]*2-1;
        printf("%lld",ans);
        return 0;
    }
  • 相关阅读:
    hdoj 1872 稳定排序
    nyoj 60 谁获得了最高奖学金
    hdoj 2066 一个人的旅行
    nyoj 8 一种排序
    bzoj1798 1
    bzoj4031
    SPOJ-HIGH
    学习笔记::矩阵树定理
    学习笔记::树上莫队
    Strip
  • 原文地址:https://www.cnblogs.com/lovewhy/p/9248805.html
Copyright © 2011-2022 走看看