1. 程式人生 > >【題解】洛谷P2568(bzoj2818)GCD 尤拉函式+字首和

【題解】洛谷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;
}

總結

考察公式推導。數論這一節各種定理推論……之前求尤拉函式表還有點迷,翻了書