●BZOJ 2820 YY的GCD
题链:
http://www.lydsy.com/JudgeOnline/problem.php?id=2820
题解:
莫比乌斯反演
先看看这个题:HDU 1695 GCD(本题简化版)
HDU 1695 GCD:求满足x∈(1~n)和y∈(1~m),且gcd(x,y)=k的(x,y)的对数。
而这个k是给定的。
可以由莫比乌斯反演得到:(详见●HDU 1695 GCD)
ANS=∑nd=1μ(d)×⌊nd⌋×⌊md⌋
但是本题的k是所有的质数,额...
我们可以先枚举一个质数p,然后仿照上面的做法,可以得到:
ANS=\sum_p \sum_{d=1}^{n}\mu(d)\times\lfloor\frac{n/p}{d}\rfloor\times\lfloor\frac{m/p}{d}\rfloor
这个复杂度还无法满足本题的数据。
然后把上面的求和式做如下化简:
令T=pd,
那么:ANS=\sum_{T=1}^{n}{(}{\lfloor\frac{n}{T}\rfloor\lfloor\frac{m}{T}\rfloor} \sum_{p|T}\mu(\frac{T}{p}){)}
如果可以预处理出\sum_{p|T}\mu(\frac{T}{p})的值,
那么上式就可以O(n)求出,
如果运用向下取整的特性进行分块计算,就可以达到O(\sqrt{n})的复杂度。
至于\sum_{p|T}\mu(\frac{T}{p}),有两种求法:
设sum[T]=\sum_{p|T}\mu(\frac{T}{p})
1.枚举每个质数p,然后把他的倍数T=\lambda p的sum[T]+=\mu(\frac{T}{p})
2.运用\mu是积性函数的性质,可以在线型筛时求出。
代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | #include<cstdio> #include<cstring> #include<iostream> #define MAXN 10000050 using namespace std; long long ANS; int musum[MAXN],mu[MAXN]; void Prime_Sieve(){ static bool np[MAXN],dp[MAXN]; mu[1]=1; static int prime[MAXN],pnt; for ( int i=2;i<=10000000;i++){ if (!np[i]) prime[++pnt]=i,dp[i]=1,mu[i]=-1,musum[i]=1; for ( int j=1;j<=pnt&&i<=10000000/prime[j];j++){ np[i*prime[j]]=1; dp[i*prime[j]]=dp[i]&&i%prime[j]; mu[i*prime[j]]=i%prime[j]?-mu[i]:0; if (i%prime[j]==0) musum[i*prime[j]]=dp[i]?mu[i]:0; else musum[i*prime[j]]=musum[i]*mu[prime[j]]+mu[i]; if (i%prime[j]==0) break ; } } for ( int i=1;i<=10000000;i++) musum[i]+=musum[i-1]; } int main(){ int n,m,Case,mini; Prime_Sieve(); scanf ( "%d" ,&Case); //while(scanf("%d",&n)) printf("%d\n",musum[n]); while (Case--){ scanf ( "%d%d" ,&n,&m); mini=min(n,m); ANS=0; for ( int i=1,last;i<=mini;i=last+1){ last=min(n/(n/i),m/(m/i)); ANS+=1ll*(musum[last]-musum[i-1])*(n/i)*(m/i); } printf ( "%lld\n" ,ANS); } return 0; } |
Do not go gentle into that good night.
Rage, rage against the dying of the light.
————Dylan Thomas
【推荐】编程新体验,更懂你的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】