bzoj 2820: YY的GCD
http://www.lydsy.com/JudgeOnline/problem.php?id=2820
推一波式子
∑isprime(p)n∑a=1m∑b=1gcd(a,b)==p
∑isprime(p)⌊np⌋∑a=1⌊mp⌋∑b=1gcd(a,b)==1
∑isprime(p)⌊np⌋∑a=1⌊mp⌋∑b=1∑d|gcd(a,b)μ(d)
∑isprime(p)⌊np⌋∑a=1⌊mp⌋∑b=1∑d|a∧d|bμ(d)
∑isprime(p)⌊np⌋∑d=1μ(d)⌊npd⌋⌊mpd⌋
将pd设为k
n∑k=1∑isprime(p)∧p|kμ(kp)⌊nk⌋⌊mk⌋
n∑k=1F(k)⌊nk⌋⌊mk⌋
就可以线性筛处理F了
#include<cstdio> #include<algorithm> #define maxn 10000007 #define LL long long LL x,y; int n,prime[maxn],miu[maxn],cnt,f[maxn],sum[maxn]; bool v[maxn]; void get_pre() { miu[1]=1; for(int i=2;i<=maxn-7;i++) { if(!v[i]) { v[i]=true;prime[++cnt]=i; miu[i]=-1;f[i]=1; } for(int j=1;j<=cnt;j++) { if(i*prime[j]>maxn-7) break; v[i*prime[j]]=true; if(i%prime[j]==0) { miu[i*prime[j]]=0; f[i*prime[j]]=miu[i]; break; } miu[i*prime[j]]=-miu[i]; f[i*prime[j]]=miu[i]-f[i]; } } for(int i=1;i<=maxn-7;i++) sum[i]=sum[i-1]+f[i]; } int main() { get_pre(); scanf("%d",&n); while(n--) { scanf("%lld%lld",&x,&y); LL k=std::min(x,y),j,ans=0; for(LL i=1;i<=k;i=j+1) { j=std::min(x/(x/i),y/(y/i)); ans+=(x/i)*(y/i)*(sum[j]-sum[i-1]); } printf("%lld\n",ans); } return 0; }
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 你所不知道的 C/C++ 宏知识
· 聊一聊 操作系统蓝屏 c0000102 的故障分析
· SQL Server 内存占用高分析
· .NET Core GC计划阶段(plan_phase)底层原理浅谈
· .NET开发智能桌面机器人:用.NET IoT库编写驱动控制两个屏幕
· 我干了两个月的大项目,开源了!
· 推荐一款非常好用的在线 SSH 管理工具
· 千万级的大表,如何做性能调优?
· 聊一聊 操作系统蓝屏 c0000102 的故障分析
· .NET周刊【1月第1期 2025-01-05】