BZOJ2818: Gcd 欧拉函数求前缀和

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

如果两个数的x,y最大公约数是z,那么x/z,y/z一定是互质的

然后找到所有的素数,然后用欧拉函数求一下前缀和就行

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
const int N = 1e7+;
const int INF=0x3f3f3f3f;
typedef unsigned long long ULL;
typedef long long LL;
bool check[N];
int phi[N],prime[N],tot,n;
LL sum[N];
int main(){
scanf("%d",&n);
phi[]=;tot=;
for(int i=;i<=n;++i){
if(!check[i]){
prime[++tot]=i;
phi[i]=i-;
}
for(int j=;j<=tot;++j){
if(i*prime[j]>n)break;
check[i*prime[j]]=true;
if(i%prime[j]==){
phi[i*prime[j]]=phi[i]*prime[j];
break;
}
else
phi[i*prime[j]]=phi[i]*(prime[j]-);
}
}
for(int i=;i<=n;++i)
sum[i]=sum[i-]+phi[i];
LL ans=;
for(int i=;i<=tot;++i)
ans+=*sum[n/prime[i]]-;
printf("%lld\n",ans);
return ;
}
上一篇:type=file的inpu美化,自定义上传按钮样式


下一篇:HDU 1695 GCD (欧拉函数,容斥原理)