2818: Gcd
Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 6707 Solved: 2952
[ Submit][ Status][ Discuss]
Description
给定整数N,求1<=x,y<=N且Gcd(x,y)为素数的
数对(x,y)有多少对.
Input
一个整数N
Output
如题
Sample Input
4
Sample Output
4
和bzoj 2820一样,可以利用莫比乌斯函数求解
但是常数太大这题过不去
其实也不用那么麻烦
算出每个质数对答案的贡献
假设Gcd(i, j)==p,那么i/p和j/p一定互质,并且这两者是充要条件
所以只要求出与i/p的互质对数即可,这不就是φ(i/p)么
欧拉筛处理出所有的φ()之后再线性统计一遍答案就出来了
ans = ∑sum(n/p)*2-1 (p∈质数,sum = ∑φ() )
#include<stdio.h>
using namespace std;
#define LL long long
int n, p, cnt, phi[10000005] = {0,1}, pri[1000005], flag[10000005];
LL sum[10000005], ans;
int main(void)
{
int n;
LL i, j;
for(i=2;i<=10000000;i++)
{
if(flag[i]==0)
{
phi[i] = i-1;
pri[++cnt] = i;
}
for(j=1;j<=cnt&&i*pri[j]<=10000000;j++)
{
flag[i*pri[j]] = 1;
if(i%pri[j]==0)
{
phi[i*pri[j]] = phi[i]*pri[j];
break;
}
else
phi[i*pri[j]] = phi[i]*phi[pri[j]];
}
}
for(i=1;i<=10000000;i++)
sum[i] = sum[i-1]+phi[i];
scanf("%d", &n);
for(i=1;i<=cnt;i++)
{
if(n/pri[i]!=0)
ans += sum[n/pri[i]]*2-1;
}
printf("%lld\n", ans);
return 0;
}