P2522 [HAOI2011]Problem b (莫比乌斯反演)
P2522 [HAOI2011]Problem b
题意:
n个询问,在 a ≤ x ≤ b , c ≤ y ≤ d a\le x\le b, c \le y \le d a≤x≤b,c≤y≤d范围内,满足gcd(x,y)=k的数对有多少个。
Solution:
反演过程
法一:
∑ x = a b ∑ y = c d [ g c d ( x , y ) = k ] = ∑ x = a b ∑ y = c d ∑ k ∣ g c d ( x , y ) [ g c d ( x k , y k ) = 1 ] = ∑ x = ⌈ a k ⌉ ⌊ b k ⌋ ∑ y = ⌈ c k ⌉ ⌊ d k ⌋ [ g c d ( x , y ) = 1 ] = ∑ x = ⌈ a k ⌉ ⌊ b k ⌋ ∑ y = ⌈ c k ⌉ ⌊ d k ⌋ ∑ d 1 ∣ g c d ( x , y ) μ ( d 1 ) = ∑ d 1 = 1 m i n ( b , d ) μ ( d 1 ) ∑ x = ⌈ a k ⌉ ⌊ b k ⌋ ∑ y = ⌈ c k ⌉ ⌊ d k ⌋ 1 = ∑ d 1 = 1 m i n ( b , d ) μ ( d 1 ) ( ⌊ b k d 1 ⌋ − ⌈ a k d 1 ⌉ + 1 ) ( ⌊ d k d 1 ⌋ − ⌈ c k d 1 ⌉ + 1 ) \sum_{x=a}^{b}\sum_{y=c}^{d}[gcd(x,y)=k] \\ =\sum_{x=a}^b\sum_{y=c}^{d}\sum_{k|gcd(x,y)}[gcd(\frac{x}{k},\frac{y}{k})=1] \\ =\sum_{x={\lceil\frac{a}{k}}\rceil}^{\lfloor\frac{b}{k}\rfloor}\sum_{y={\lceil\frac{c}{k}}\rceil}^{\lfloor\frac{d}{k}\rfloor}[gcd(x,y)=1] \\ =\sum_{x={\lceil\frac{a}{k}}\rceil}^{\lfloor\frac{b}{k}\rfloor}\sum_{y={\lceil\frac{c}{k}}\rceil}^{\lfloor\frac{d}{k}\rfloor}\sum_{d_1|gcd(x,y)}\mu(d_1) \\ =\sum_{d_1=1}^{min(b,d)}\mu(d_1)\sum_{x={\lceil\frac{a}{k}}\rceil}^{\lfloor\frac{b}{k}\rfloor}\sum_{y={\lceil\frac{c}{k}}\rceil}^{\lfloor\frac{d}{k}\rfloor} 1 \\ =\sum_{d_1=1}^{min(b,d)}\mu(d_1)(\lfloor\frac{b}{kd_1}\rfloor -\lceil\frac{a}{kd_1}\rceil+1)(\lfloor\frac{d}{kd_1}\rfloor -\lceil\frac{c}{kd_1}\rceil+1) x=a∑by=c∑d[gcd(x,y)=k]=x=a∑by=c∑dk∣gcd(x,y)∑[gcd(kx,ky)=1]=x=⌈ka⌉∑⌊kb⌋y=⌈kc⌉∑⌊kd⌋[gcd(x,y)=1]=x=⌈ka⌉∑⌊kb⌋y=⌈kc⌉∑⌊kd⌋d1∣gcd(x,y)∑μ(d1)=d1=1∑min(b,d)μ(d1)x=⌈ka⌉∑⌊kb⌋y=⌈kc⌉∑⌊kd⌋1=d1=1∑min(b,d)μ(d1)(⌊kd1b⌋−⌈kd1a⌉+1)(⌊kd1d⌋−⌈kd1c⌉+1)
法二:
由通用的反演式子 F ( n ) = ∑ n ∣ d f ( d ) , f ( n ) = ∑ n ∣ d μ ( d n ) F ( d ) F(n)=\sum_{n|d}f(d),f(n)=\sum_{n|d}\mu(\frac{d}{n})F(d) F(n)=∑n∣df(d),f(n)=∑n∣dμ(nd)F(d)推出
设 f ( k ) = ∑ x = a b ∑ y = c d [ g c d ( x , y ) = k ] f(k)=\sum_{x=a}^{b}\sum_{y=c}^{d}[gcd(x,y)=k] f(k)=∑x=ab∑y=cd[gcd(x,y)=k]
那么
F ( n ) = ∑ n ∣ k f ( k ) = ∑ n ∣ k ∑ x = a b ∑ y = c d [ g c d ( x , y ) = k ] = ∑ x = a b ∑ y = c d [ n ∣ g c d ( x , y ) ] = ( ⌊ b n ⌋ − ⌈ a n ⌉ + 1 ) ( ⌊ d n ⌋ − ⌈ c n ⌉ + 1 ) F(n)=\sum_{n|k}f(k) \\ =\sum_{n|k}\sum_{x=a}^{b}\sum_{y=c}^{d}[gcd(x,y)=k] \\ =\sum_{x=a}^{b}\sum_{y=c}^{d}[n|gcd(x,y)] \\ =(\lfloor\frac{b}{n}\rfloor -\lceil\frac{a}{n}\rceil+1)(\lfloor\frac{d}{n}\rfloor -\lceil\frac{c}{n}\rceil+1) F(n)=n∣k∑f(k)=n∣k∑x=a∑by=c∑d[gcd(x,y)=k]=x=a∑by=c∑d[n∣gcd(x,y)]=(⌊nb⌋−⌈na⌉+1)(⌊nd⌋−⌈nc⌉+1)
反过来推出(对后面的式子中有个说明n=d1*k)
f ( k ) = ∑ k ∣ n μ ( n k ) F ( n ) = ∑ k ∣ n μ ( n k ) ( ⌊ b n ⌋ − ⌈ a n ⌉ + 1 ) ( ⌊ d n ⌋ − ⌈ c n ⌉ + 1 ) = ∑ d 1 = 1 m i n ( b k , d k ) μ ( d 1 ) ( ⌊ b k d 1 ⌋ − ⌈ a k d 1 ⌉ + 1 ) ( ⌊ d k d 1 ⌋ − ⌈ c k d 1 ⌉ + 1 ) f(k)=\sum_{k|n}\mu(\frac{n}{k})F(n) \\ =\sum_{k|n}\mu(\frac{n}{k})(\lfloor\frac{b}{n}\rfloor -\lceil\frac{a}{n}\rceil+1)(\lfloor\frac{d}{n}\rfloor -\lceil\frac{c}{n}\rceil+1) \\ =\sum_{d_1=1}^{min(\frac{b}{k},\frac{d}{k})}\mu(d_1)(\lfloor\frac{b}{kd_1}\rfloor -\lceil\frac{a}{kd_1}\rceil+1)(\lfloor\frac{d}{kd_1}\rfloor -\lceil\frac{c}{kd_1}\rceil+1) f(k)=k∣n∑μ(kn)F(n)=k∣n∑μ(kn)(⌊nb⌋−⌈na⌉+1)(⌊nd⌋−⌈nc⌉+1)=d1=1∑min(kb,kd)μ(d1)(⌊kd1b⌋−⌈kd1a⌉+1)(⌊kd1d⌋−⌈kd1c⌉+1)
到这里,反演的式子也就推出来了。但是,你不会以为到这里就结束了吧。不会吧!不会吧!
当你把代码写出来,然后提交,惊喜的发现WA了(可达鸭眉头一皱,发现事情并不简单)。
若是暴力的去跑这个反演式子,你就会发现复杂度并不够优秀,TLE了,因此要对这个过程进行优化,通过分块优化这个过程。
但是只是套上一个分块,并对 μ \mu μ进行前缀求和是不够的。
要发现前缀求和的这个特点
∑ i = a b ∑ j = c d ( . . . ) = ∑ i = 1 b ∑ j = c d ( . . . ) − ∑ i = 1 a − 1 ∑ j = c d ( . . . ) = ∑ i = 1 b ∑ j = 1 d ( . . . ) − ∑ i = 1 b ∑ j = 1 c − 1 ( . . . ) − ( ∑ i = 1 a − 1 ∑ j = 1 d ( . . . ) − ∑ i = 1 a − 1 ∑ j = 1 c − 1 ( . . . ) ) = ∑ i = 1 b ∑ j = 1 d ( . . . ) − ∑ i = 1 b ∑ j = 1 c − 1 ( . . . ) − ∑ i = 1 a − 1 ∑ j = 1 d ( . . . ) + ∑ i = 1 a − 1 ∑ j = 1 c − 1 ( . . . ) \sum_{i=a}^{b}\sum_{j=c}^{d}(...) \\ =\sum_{i=1}^{b}\sum_{j=c}^{d}(...)-\sum_{i=1}^{a-1}\sum_{j=c}^{d}(...) \\=\sum_{i=1}^{b}\sum_{j=1}^{d}(...)-\sum_{i=1}^{b}\sum_{j=1}^{c-1}(...)-(\sum_{i=1}^{a-1}\sum_{j=1}^{d}(...)-\sum_{i=1}^{a-1}\sum_{j=1}^{c-1}(...)) \\ =\sum_{i=1}^{b}\sum_{j=1}^{d}(...)-\sum_{i=1}^{b}\sum_{j=1}^{c-1}(...)-\sum_{i=1}^{a-1}\sum_{j=1}^{d}(...)+\sum_{i=1}^{a-1}\sum_{j=1}^{c-1}(...) i=a∑bj=c∑d(...)=i=1∑bj=c∑d(...)−i=1∑a−1j=c∑d(...)=i=1∑bj=1∑d(...)−i=1∑bj=1∑c−1(...)−(i=1∑a−1j=1∑d(...)−i=1∑a−1j=1∑c−1(...))=i=1∑bj=1∑d(...)−i=1∑bj=1∑c−1(...)−i=1∑a−1j=1∑d(...)+i=1∑a−1j=1∑c−1(...)
以上推演过程过于复杂,容易出错,所以一般将[a,b]的范围变成[1,b]-[1,a-1],这样就不用弄清楚上下界取整的情况。
代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define INF 0x3f3f3f3f
int mu[50005];
int vis[50005];
int prime[50005],cnt=0;
int pre[50005];
void initMul()
{mu[1]=1;for(int i=2;i<=50000;i++){if(!vis[i]){mu[i]=-1;prime[cnt++]=i;}for(int j=0;j<cnt&&1ll*i*prime[j]<=50000;j++){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=1;i<=50000;i++)pre[i]=pre[i-1]+mu[i];
}
ll calc(int a,int b)
{ll res=0;int M=min(a,b);for(int l=1,r;l<=M;l=r+1){r=min(a/(a/l),b/(b/l));res+=1ll*(pre[r]-pre[l-1])*(a/l)*(b/l);}return res;
}
int main()
{initMul();int n;scanf("%d",&n);while(n--){int a,b,c,d,k;scanf("%d%d%d%d%d",&a,&b,&c,&d,&k);ll res=calc(b/k,d/k)-calc(b/k,(c-1)/k)-calc((a-1)/k,d/k)+calc((a-1)/k,(c-1)/k);printf("%lld\n",res);}return 0;
}
P2522 [HAOI2011]Problem b (莫比乌斯反演)相关推荐
- P2522 HAOI2011 Problem b [莫比乌斯反演,数论分块]
P2522 HAOI2011 题意 对于给出的n个询问,每次求有多少个数对(x,y)(x,y)(x,y),满足a≤x≤ba≤x≤ba≤x≤b,c≤y≤dc≤y≤dc≤y≤d,且gcd(x,y)=kgc ...
- BZOJ2301: [HAOI2011]Problem b[莫比乌斯反演 容斥原理]【学习笔记】
2301: [HAOI2011]Problem b Time Limit: 50 Sec Memory Limit: 256 MB Submit: 4032 Solved: 1817 [Submi ...
- [POI2007]ZAP-Queries [HAOI2011]Problem b 莫比乌斯反演
1,[POI2007]ZAP-Queries ---题面--- 题解: 首先列出式子:$$ans = \sum_{i = 1}^{n}\sum_{j = 1}^{m}[gcd(i, j) == d]$ ...
- BZOJ2301:[HAOI2011]Problem b(莫比乌斯反演,容斥)
Description 对于给出的n个询问,每次求有多少个数对(x,y),满足a≤x≤b,c≤y≤d,且gcd(x,y) = k,gcd(x,y)函数为x和y的最大公约数. Input 第一行一个整数 ...
- BZOJ2301: [HAOI2011]Problem b(莫比乌斯反演)
Description 对于给出的n个询问,每次求有多少个数对(x,y),满足a≤x≤b,c≤y≤d,且gcd(x,y) = k,gcd(x,y)函数为x和y的最大公约数. Input 第一行一个整数 ...
- P2522 [HAOI2011]Problem b
P2522 [HAOI2011]Problem b 题意: 对于给出的 n 个询问,每次求有多少个数对 (x,y),满足 a≤x≤b,c≤y≤d,且 gcd(x,y)=k,gcd(x,y) 函数为 x ...
- 洛谷P2522 [HAOI2011]Problem b(莫比乌斯反演)
传送门 我们考虑容斥,设$ans(a,b)=\sum_{i=1}^a\sum_{j=1}^b[gcd(a,b)==k]$,这个东西可以和这一题一样去算洛谷P3455 [POI2007]ZAP-Quer ...
- HDU 6833 A Very Easy Math Problem(莫比乌斯反演)
原题题面 Given you n,x,k , find the value of the following formula: ∑ a 1 = 1 n ∑ a 2 = 1 n . . . ∑ a x ...
- BZOJ 2301: [HAOI2011]Problem b
二次联通门 : BZOJ 2301: [HAOI2011]Problem b /*BZOJ 2301: [HAOI2011]Problem b莫比乌斯反演 + 容斥将k除下来后就变为了一道原题后像求二 ...
最新文章
- CSS实现网页图片预加载
- 改权限 chown改用户归属_域权限维持 | 改密码我也能获取你的密码 | Hook PasswordChangeNotify 攻击...
- 安卓开发中RelativeLayout中的各个属性
- 深度学习之表面缺陷识别
- 内存四区(代码区 静态区 栈区 堆区)
- fcpx怎么合成延时摄影_延时摄影合成终极后期教程
- 前端学习(3138):react-hello-react之组件挂载流程
- bread是可数还是不可数_可数名词不可数名词分不清?出题老师告诉你方法
- sh.k7p.work/index.php,Laowang's Blogs
- python输入时间_一文搞懂python日期时间处理
- 关于linux文件权限的说明
- BZOJ1079 [SCOI2008]着色方案 【dp记忆化搜索】
- 【POJ2318】TOYS(点在凸多边形内判定---模版暴力/二分)
- 使用Python批量转换图片格式
- 各种缩写名词汇总,力求最全面最精确
- Ubuntu18.04+思岚激光雷达A2M7+ROS测试
- 模拟登录人人网,豆瓣
- k8s node节点重启后遇到的问题及解决
- 下载微软官方原版系统镜像
- 可转债第一课:神奇的可转债
热门文章
- xen-3.4.2安装(一)
- 华强北又给苹果上了一课,成功破解美版iPhone 14 eSIM !
- iLEX RAT冬青鼠
- 【定时任务】时间轮算法
- 【千律】OpenCV基础:通过图像颜色进行文字提取
- 惠普计算机工作站,惠普工作站的具体分类有哪几种呢?
- 奇才获860万美元伤病交易特例 解球队燃眉之急
- 在单片机中如何实现手动/自动控制外设
- 节假日处理数据库集群异常小记
- php把1拆分成三份,谁知道Excel电子表格怎么把一个单元格分3份(分成3个三角)! | excle表格怎么分割三份...