【题解】洛谷P2568(bzoj2818)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


在这里插入图片描述

#include<cstdio>
typedef long long ll;
const int N=1e7+10;
int n,p,prime[N/10],phi[N];
bool iscomp[N];
ll sum[N],ans;
void eular()
{
	phi[1]=1;
	for(int i=2;i<=n;i++)
	{
		if(!iscomp[i])prime[p++]=i,phi[i]=i-1;
		for(int j=0;j<p&&i*prime[j]<=n;j++)
		{
			iscomp[i*prime[j]]=1;
			phi[i*prime[j]]=phi[i]*(i%prime[j]?prime[j]-1:prime[j]);
		}
	}
}
int main()
{
	scanf("%d",&n);
    eular();
    for(int i=1;i<=n;i++)sum[i]=sum[i-1]+phi[i];
    for(int i=0;i<p;i++)ans+=sum[n/prime[i]]*2-1;
    printf("%lld\n",ans);
    return 0;
}

总结

考察公式推导。数论这一节各种定理推论……之前求欧拉函数表还有点迷,翻了书

猜你喜欢

转载自blog.csdn.net/qq_41958841/article/details/82783400