luogu P2398 GCD SUM
背景:
以下图片均来自我的文件,谢绝转载。
题目传送门:
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));
}