1. 程式人生 > >luogu P2398 GCD SUM

luogu P2398 GCD SUM

背景:

以下圖片均來自我的 P D F PDF 檔案,謝絕轉載。

題目傳送門:

https://www.luogu.org/problemnew/show/P2398

題意:

在這裡插入圖片描述

思路:

在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述

程式碼:

並沒有用杜教篩實現,用的是線性篩(資料範圍小)。

#include<cstdio>
#include<algorithm>
#define LL long long
using namespace std;
	int n,t=0,ans=0;
	int phi[100010],prime[100010];
	LL sum[100010];
void init(int ma)
{
	phi[1]=1;
	for(int i=2;i<=ma;i++)
	{
		if(!phi[i])
		{
			prime[++t]=i;
			phi[i]=i-1;
		}
		for(int j=1;j<=t&&i*prime[
j]<=ma;j++) { if(!(i%prime[j])) { phi[i*prime[j]]=phi[i]*prime[j]; break; } phi[i*prime[j]]=phi[i]*(prime[j]-1); } } for(int i=1;i<=ma;i++) sum[i]=sum[i-1]+phi[i]; } LL calc(int n,int m) { int l=1,r; LL tot=0; while(l<=min(n,m)) { r=min(n/(n/l),m/(m/l)); tot+=
(LL)(n/l)*(LL)(m/l)*(LL)(sum[r]-sum[l-1]); l=r+1; } return tot; } int main() { scanf("%d",&n); init(n); printf("%lld",calc(n,n)); }