Darkbzoj 2818 Gcd
Darkbzoj 2818 Gcd
链接:https://darkbzoj.tk/problem/2818
规定 为逻辑判断函数,若 为真则 ,否则 。
这题要我们统计的是:
我们可以用莫比乌斯反演化简成:
但是这样子我们的复杂度是 的,我们考虑换一种式子的化简方式。我们考虑如何快速求出 的个数。
个数为:
解释一下式子,如果 那么一定有 ,所以 只用累计到 就好了,那么 这个式子显然就是 。又因为 会重复统计 次,所以需要减掉。化简出来的这个式子我们可以用前缀和做到 预处理, 查询。欧拉函数和质数也可以用欧拉筛在 的时间内求出。
所以我们只用枚举 之内的质数,然后 查询即可。
总时间复杂度为
代码如下:
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int MAXN = 1e7+5;
int pc,prime[MAXN],p[MAXN],n;
ll phi[MAXN];
int main()
{
scanf("%d",&n);
phi[1]=1;
for(int i=2;i<=n;++i)
{
if(!p[i]) prime[++pc]=i,phi[i]=i-1;
for(int j=1;j<=pc&&1ll*i*prime[j]<=n;++j)
{
p[i*prime[j]]=1;
if(i%prime[j]==0)
{
phi[i*prime[j]]=phi[i]*prime[j];
break;
}
phi[i*prime[j]]=phi[i]*phi[prime[j]];
}
}
for(int i=1;i<=n;++i) phi[i]+=phi[i-1];
ll ans=0;
for(int i=1;i<=pc;++i)
ans+=2*phi[n/prime[i]]-1;
printf("%lld\n",ans);
return 0;
}
路漫漫其修远兮,吾将上下而求索。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】