【BZOJ2301】problem b,数论之莫比乌斯反演
Time:2016.05.27
Author:xiaoyimi
转载注明出处谢谢
传送门
思路:
∑di=c∑bj=a[gcd(i,j)=k]∑^{d}_{i=c}∑^{b}_{j=a}[gcd(i,j)=k]
=∑di=1∑bj=1[gcd(i,j)=k]−∑c−1i=1∑bj=1[gcd(i,j)=k]−∑di=1∑a−1j=1[gcd(i,j)=k]+∑c−1i=1∑a−1j=1[gcd(i,j)=k]=∑^{d}_{i=1}∑^{b}_{j=1}[gcd(i,j)=k]-∑^{c-1}_{i=1}∑^{b}_{j=1}[gcd(i,j)=k]-∑^{d}_{i=1}∑^{a-1}_{j=1}[gcd(i,j)=k]+∑^{c-1}_{i=1}∑^{a-1}_{j=1}[gcd(i,j)=k]
可以观察到上面这四个式子都是类似的,我们只用处理一个就好
这里选用
∑di=1∑bj=1[gcd(i,j)=k]∑^{d}_{i=1}∑^{b}_{j=1}[gcd(i,j)=k]
令i=ki,j=kji=ki,j=kj
=∑⌊dk⌋i=1∑⌊bk⌋j=1[gcd(i,j)=1]=∑^{⌊\frac d k⌋}_{i=1}∑^{⌊\frac b k⌋}_{j=1}[gcd(i,j)=1]
=∑⌊dk⌋i=1∑⌊bk⌋j=1∑p|gcd(i,j)μ(p)=∑^{⌊\frac d k⌋}_{i=1}∑^{⌊\frac b k⌋}_{j=1}∑_{p|gcd(i,j)}μ(p)
设b<=d,a<=cb
=∑⌊dk⌋i=1∑⌊bk⌋j=1∑[p|i][p|j]μ(p)=∑^{⌊\frac d k⌋}_{i=1}∑^{⌊\frac b k⌋}_{j=1}∑_{[p|i][p|j]}μ(p)
=∑⌊bk⌋p=1⌊bpk⌋⌊dpk⌋μ(p)=∑_{p=1}^{⌊\frac b k⌋}⌊\frac b {pk}⌋⌊\frac d {pk}⌋μ(p)
μ可以前缀和处理,然后⌊bpk⌋⌊dpk⌋⌊\frac b {pk}⌋⌊\frac d {pk}⌋的取值只有n√\sqrt n个,每次O(nn√)O(n\sqrt n)分块处理,总复杂度O(nn√)O(n\sqrt n)
注意:
1.实测不用开long long
2.推式子一定要细心,我刚开始就推错了好几次,尤其是分别处理4个式子,并且搞混了abcd……
3.好久不碰数论,欧拉筛都不会了……
代码:
#include<cstdio>
#include<cstring>
#include<iostream>
#include<cmath>
#define M 50004
using namespace std;
int n,a,b,c,d,k;
int mu[M],prime[M];
bool vis[M];
int in()
{char ch=getchar();int t=0;while (!isdigit(ch)) ch=getchar();while (isdigit(ch)) t=(t<<3)+(t<<1)+ch-48,ch=getchar();return t;
}
int solve(int x,int y)
{if (x>y) swap(x,y);int ans=0,last;for (int i=1;i<=x;i=last+1){last=min(x/(x/i),y/(y/i));ans+=(mu[last]-mu[i-1])*(x/i)*(y/i);}return ans;
}
main()
{mu[1]=1;for (int i=2;i<=50000;i++){if (!vis[i])prime[++prime[0]]=i,mu[i]=-1;for (int j=1;j<=prime[0];j++)if (prime[j]*i>50000) break;else{vis[i*prime[j]]=1;if (i%prime[j])mu[i*prime[j]]=-mu[i];else{mu[i*prime[j]]=0;break;}}}for (int i=2;i<=50000;i++) mu[i]+=mu[i-1];n=in();while (n--){a=in()-1;b=in();c=in()-1;d=in();k=in();a/=k;b/=k;c/=k;d/=k;printf("%d\n",solve(b,d)-solve(b,c)-solve(d,a)+solve(a,c)); }
}
【BZOJ2301】problem b,数论之莫比乌斯反演相关推荐
- P6271 [湖北省队互测2014]一个人的数论(莫比乌斯反演,拉格朗日插值)
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 P6271 [湖北省队互测2014]一个人的数论(莫比乌斯反演,拉格朗日插值) Problem Sol ...
- 数论变换 - 莫比乌斯反演篇
2020.8.17 今天第一次屁股坐在椅子上学莫比乌斯反演的一天.本来是想让队友学的,现在队友不知道换了多少人了,也没几个真的能靠得住的,还都得看自己.其实学到现在这个程度,除了一些极其吃天赋的问题, ...
- P6271 [湖北省队互测2014]一个人的数论(莫比乌斯反演 + 伯努利数)
P6271 [湖北省队互测2014]一个人的数论 ∑i=1nim[gcd(i,n)=1]∑d∣nμ(d)dm∑i=1ndim由伯努利数可知∑i=0nim=1m+1∑i=0mCm+1iBi(n+1)m ...
- 【codevs4355】王的对决(简单数论) 莫比乌斯反演
题目描述 Description /*在神秘而遥远的T国度生活着一群神奇的物种--DD! DD们有着独特的生活习惯,他们总是喜欢居住在tree上,而且只有上层住了DD下层才能再住.并且每层住的DD最多 ...
- 【bzoj 3601】一个人的数论 (莫比乌斯反演+伯努利数)
题解: (吐槽:网上题解那个不严谨猜测真是没谁了--关键是还猜得辣么准--) 直接化简到求和那一段: $f_{d}(n)=\sum_{t|n}\mu(t)t^{d}\sum_{i=1}^{\frac{ ...
- 【BZOJ3601】一个人的数论,莫比乌斯反演+高斯消元
Time:2016.08.18 Author:xiaoyimi 转载注明出处谢谢 传送门 思路: 真是太神了 我要能写出来一半,我就-- 希望明年的自己能独立做出来 大犇博客 代码: #include ...
- 关于数论【莫比乌斯反演】
由于这个证明过程太过长...推荐大家看这个大佬的博文,我就是看这个学会的 http://www.cnblogs.com/chenyang920/p/4811995.html 原式 : G(n)=sig ...
- BZOJ2301: [HAOI2011]Problem b[莫比乌斯反演 容斥原理]【学习笔记】
2301: [HAOI2011]Problem b Time Limit: 50 Sec Memory Limit: 256 MB Submit: 4032 Solved: 1817 [Submi ...
- BZOJ 1101 Luogu P3455 POI 2007 Zap (莫比乌斯反演+数论分块)
BZOJ 1101 Luogu P3455 POI 2007 Zap (莫比乌斯反演+数论分块) 手动博客搬家: 本文发表于20171216 13:34:20, 原地址https://blog.csd ...
最新文章
- python Demo 01 爬取大学名称
- 12c oracle 修改内存_关于Oracle数据库12c 新特性总结
- 在JavaFX程序中嵌入Swing内容
- 手机MMI体系结构及其实现
- php-cli下载,php-cli-color
- 武侠乂怎么修改服务器,武侠乂怎么操作 按键功能详细介绍
- 安卓学习笔记25:常用控件 - 下拉列表
- unique去除重复的向量_R语言向量与因子
- 单例模式、使用getInstance()方法的原因及作用
- 铺铜规则在哪设定_干货丨PCB layout结合生产设计必须遵循这六大规则!
- C# 电子白板软件开发
- 【2014.01】普林斯顿数学指南(第一卷) [英]Timothy Gowers编 齐民友译
- 用Python爬取漫画并转换格式为pdf和mobi
- Java基础入门及安装准备
- 每天学命令get_propertysi_attacker Properties
- python数据可视化学习之随机漫步
- 第一代程序员王小波,逝世 25 周年
- python在abaqus中的应用pdf_Python语言在Abaqus中的应用
- 设计师必备!免费下载 PSD 素材的32个网站
- 《人力资源视角下的企业数字化转型》高峰圆桌论坛圆满闭幕
热门文章
- 补习系列(20)-大话 WebSocket 与 尬聊的实现
- kohana php,[php框架]kohana中文译本.pdf
- C++知识点 多态、静态多态、动态多态
- 关于Word2016敲入公式的新方法
- 高等组合学笔记(六): 第二类Stirling数,第一类Stirling数以及生成函数
- 一分钟教你在PyTorch跑模型的时候提取中间层查看图片
- 运行opencv保存视频时出现错误的解决方法
- RDD Join 性能调优
- 简单版---JS获得某天是一年当中的第几天
- react更改路由入参_react路由传参方式