ccz181078

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: :: 管理 ::

Description

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

1<=x,y<=N且Gcd(x,y)为质数等价于Gcd(x/p,y/p)=1,p为质数,

 线性筛求1~n的欧拉函数值和质数表,

对欧拉函数求前缀和,枚举质数计算x/p<y/p的情况,结果乘二(加上x/p>y/p的情况),

最后加上x=y=p的情况

 

#include <cstdio>
bool isnp[10000001]={1,1};
int N=10000000,phi[10000001]={0,0};
int ps[1000000],p=0;
int n=0;
long long as[10000001],ans=0;
int main(){
    int i;
    scanf("%d",&n);
    for(i=2;i<=n;i++){
        if(!isnp[i])ps[p++]=i,phi[i]=i-1;
        for(int j=0;j<p&&i*ps[j]<=N;j++){
            isnp[i*ps[j]]=1;
            if(i%ps[j])phi[i*ps[j]]=phi[i]*(ps[j]-1);
            else{
                phi[i*ps[j]]=phi[i]*ps[j];
                break;
            }
        }
    }
    for(i=1;i<=n;i++)as[i]=as[i-1]+phi[i];
    for(i=0;i<p&&ps[i]<=n;i++)ans+=as[n/ps[i]];
    printf("%lld",ans+ans+i);
    return 0;
}

 

posted on 2016-01-16 20:58  nul  阅读(430)  评论(0编辑  收藏  举报