[BZOJ2820]YY的GCD(莫比乌斯反演+线性筛)
来源:互联网 发布:python 绝对路径 编辑:程序博客网 时间:2024/06/06 02:06
题目:
我是超链接
题解:
诶这个题眼熟哦,我做过呀!然后无视数据范围交了一发T。。。。弄个O(n)回答的我是不是疯了!
然后这就成了我真正的莫比乌斯反演的入门题!
可以看出如果我们计算出的前缀和,我们就可以用分块优化除法在O(√N+√M)的时间回答每个询问
这个g我们可以用线筛来求
1、如果T为质数g(T)=μ(T/T)=1
2、如果已知g(T),我们要给T增加一个以前没有过的质因子 pri,计算出g(T*pri)的值,我们分为两种情况:①枚举的质数不是pri,那我们相当于给每个μ(T/p)都又乘了一个质因子,相当于取反;②枚举的质数是pri,正好除掉了这个新来的,那就是累加上μ(T);综上所述g(T*pri)= μ(T)-g(T)
3、如果已知g(T),我们要给T增加一个以前出现过的质因子 pri,计算出g(T*pri)的值,我们依然分为两种情况:①枚举的质数不是pri,那至少这个pri的次数>=2,值就变成0啦,相当于对答案没有贡献;②枚举的质数是pri,那我们相当于把这个乘上的数除掉了,那就是类加上μ(T);综上所述g(T*pri)= μ(T)
当然我们画一通柿子也是可以解决这个问题的,但是画到这个题的份上依然不行
代码:
#include <cstdio>#include <iostream>#define LL long longusing namespace std;const int N=10000000;LL g[N+5];int mu[N+5],pri[N+5],num;bool ss[N+5];void get_mu(){ mu[1]=1; for (int i=2;i<=N;i++) { if (!ss[i]) { pri[++num]=i; mu[i]=-1; g[i]=1; } for (int j=1;j<=num && pri[j]*i<=N;j++) { ss[pri[j]*i]=1; if (i%pri[j]==0) { g[pri[j]*i]=mu[i]; break; } mu[pri[j]*i]=-mu[i]; g[pri[j]*i]=mu[i]-g[i]; } } for (int i=1;i<=N;i++) g[i]+=g[i-1];}int main(){ get_mu(); int T,m,n,i,j;scanf("%d",&T); while (T--) { long long ans=0; scanf("%d%d",&n,&m); if (n>m) swap(n,m); for (i=1;i<=n;i=j+1) { j=min(n,min(n/(n/i),m/(m/i))); ans+=((long long)(n/i)*(long long)(m/i))*(g[j]-g[i-1]); } printf("%lld\n",ans); }}
结语:
如果科学地设出一个函数,用这个函数来做反演,就比推式子要简单很多。。
如果出现了类似i∗d在分母这样的东西,考虑一下能不能把i∗d看成一个整体,从枚举倍数转为枚举因数。这样往往可以构造出能够线筛的函数,这也是很多反演题目的常见思路。
如果觉得博主写的丑的话学习源是优秀的学姐
阅读全文
1 0
- bzoj2820 [bzoj2820]YY的GCD(线性素数筛+莫比乌斯反演)
- [BZOJ2820]YY的GCD(莫比乌斯反演+线性筛)
- [BZOJ2820]YY的GCD(莫比乌斯反演)
- 【bzoj2820】YY的GCD 线性筛法+莫比乌斯反演+数论分块
- bzoj2820: YY的GCD 莫比乌斯反演
- 【莫比乌斯反演】[BZOJ2820]YY的GCD
- 【bzoj2820】YY的GCD 莫比乌斯反演
- 【bzoj2820】【YY的gcd】【莫比乌斯反演】
- Bzoj2820:YY的GCD:莫比乌斯反演
- [bzoj2820]YY的GCD 莫比乌斯反演
- 【莫比乌斯反演】BZOJ2820 YY的GCD
- bzoj2820 YY的GCD【莫比乌斯反演】
- BZOJ2820 YY的GCD 莫比乌斯反演
- BZOJ2820 YY的GCD 【莫比乌斯反演】
- 莫比乌斯反演练习bzoj2440;bzoj2301;bzoj2820 YY的GCD
- [莫比乌斯反演+分块求和] BZOJ2820: YY的GCD
- bzoj2820 YY的 (莫比乌斯函数)
- bzoj2820(莫比乌斯反演)
- 【mysql 存储引擎】MySQL常用存储引擎及特点
- Android四大组件之Activity
- ZYNQ基础系列(二) IO口模拟HDMI
- RabbitMQ入门HelloWorld(C#)
- 160个练手CrackMe-040
- [BZOJ2820]YY的GCD(莫比乌斯反演+线性筛)
- Redis一主两从+哨兵监控
- Tomcat9源代码分析(二)-初始化
- 412. Fizz Buzz
- Http Client 客户端编码
- 面向对象
- Zookeeper_典型应用场景
- Intellij IDEA maven配置执行自动化测试
- Spring中bean的三种装配机制之一—java configure