BZOJ 1101 Luogu P3455 POI 2007 Zap (莫比乌斯反演+数论分块)

手动博客搬家: 本文发表于20171216 13:34:20, 原地址https://blog.csdn.net/suncongbo/article/details/78819470

URL: (Luogu)https://www.luogu.org/problem/show?pid=3455
(BZOJ)http://www.lydsy.com/JudgeOnline/problem.php?id=1101

题目大意:
有t次询问(\(t\le5e4\)), 每次给定a,b,d, 询问有多少对(x,y)满足x<=a, y<=b, gcd(a,b)=d. 0<=d<=a,b<=5e4

思路分析:
首先,需要注意的是,要特殊处理\(d=0\)的情况,答案为0.
对于\(d\ge1\), 采用莫比乌斯反演解决:
先将a/=d, b/=d, 因此只需求gcd(x,y)=1的数的对数。
令F[i]表示\(1\le x\le a,1\le y\le b\)且\(i|gcd(x,y)\)的a,b总数, f[i]表示gcd(x,y)=i的数的对数(此处a,b都已经除以d).因此问题转化为求f(1).
根据莫比乌斯反演公式:\[F(n)=\sum_{n|x} f(x), f(n)=\sum_{n|x} F(x)\mu(\frac{x}{n})\]
因此,\(f(1)=\sum_{1|x} F(x)\mu(x)\)
而显然我们有\(F(x)=[\frac{a}{x}][\frac{b}{x}]\), 因此可以\(O(1)\)地求出F(x), 也就可以\(O(min(a,b))\)地求出f(1)了。(莫比乌斯反演函数\(\mu(x)\)可在线性筛中求出)
可是这样还不够。算算复杂度,发现会TLE.
注意到一个性质: 对于\(x\le\sqrt{a}\), \([\frac{a}{x}]\)的值变化得很快,\([\frac{a}{x}]\)的变化速度远高于\(x\)的变化速度。而对于\(x\gt\sqrt{a}\), \([\frac{a}{x}]\)的值变化得很慢, 远低于\(x\)的变化速度。因此,我们可以求出所有使得\([\frac{a}{x}]\)的值变化的点x, 共有\(O(\sqrt{n})\)个(实际上带一个常数2), 然后我们对b做同样的操作。将所有影响\([\frac{a}{x}]\)和\([\frac{b}{x}]\)的值的点都从小到大排序记录下来,处理莫比乌斯函数的前缀和, 每一个点代表一个区间,这个区间内所有的数\([\frac{a}{x}]\)与\([\frac{b}{x}]\)的值分别与这个数\([\frac{a}{x}]\)和\([\frac{b}{x}]\)相等。然后这一段区间对答案的贡献就是区间的\(\mu()\)之和乘以\([\frac{a}{x}][\frac{b}{x}]\).

代码实现

#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;const int N = 5e4;
const int NN = 317;
int p[N+2];
bool f[N+2];
int mu[N+2];
int s[N+2];
int g[(NN<<2)+2];
int h[(NN<<2)+2];
int a,b,d,m;void Mobius()
{f[1] = true; mu[1] = 1; m = 0;for(int i=2; i<=N; i++){if(!f[i]) {p[++m] = i; mu[i] = -1;}for(int j=1; p[j]*i<=N; j++){f[p[j]*i] = true;if(i%p[j]==0){mu[i*p[j]] = 0;break;}else mu[i*p[j]] = -mu[i];}}
}void merge(int aa,int bb)
{int i = 1,j = (aa<<1)+1,k = 1;while(i<=(aa<<1) && j<=(aa<<1)+(bb<<1)){if(h[i]<h[j]) g[k++] = h[i++];else g[k++] = h[j++];}while(i<=(aa<<1)) g[k++] = h[i++];while(j<=(aa<<1)+(bb<<1)) g[k++] = h[j++];
}int main()
{int t; scanf("%d",&t);Mobius(); s[0] = 0;for(int i=1; i<=N; i++) s[i] = s[i-1]+mu[i];while(t--){scanf("%d%d%d",&a,&b,&d);if(d==0) {printf("0\n"); continue;}if(a>b) swap(a,b);a /= d; b /= d;int aa = (int)sqrt(a),bb = (int)sqrt(b);long long ans = 0ll;for(int i=1; i<=aa; i++) h[i] = i;for(int i=aa; i>=1; i--) h[(aa<<1)-i+1] = a/i;//保证h[]在1~(aa<<1)范围内有序for(int i=1; i<=bb; i++) h[i+(aa<<1)] = i;for(int i=bb; i>=1; i--) h[(aa<<1)+(bb<<1)-i+1] = b/i;//保证h[]在1~(bb<<1)范围内有序merge(aa,bb);//将[1,aa<<1]与[aa<<1+1,aa<<1+bb<<1]归并起来for(int i=1; i<=(aa<<1)+(bb<<1); i++){ans += (long long)(s[g[i]]-s[g[i-1]])*(a/g[i])*(b/g[i]);}printf("%lld\n",ans);}return 0;
}

发表于 2018-12-26 22:54 suncongbo 阅读(...) 评论(...) 编辑 收藏

刷新评论刷新页面返回顶部

BZOJ 1101 Luogu P3455 POI 2007 Zap (莫比乌斯反演+数论分块)相关推荐

  1. BZOJ 1101 Luogu P3455 POI 2007 Zap (莫比乌斯反演+分块)

    URL: (Luogu)https://www.luogu.org/problem/show?pid=3455 (BZOJ)http://www.lydsy.com/JudgeOnline/probl ...

  2. luogu P3455 [POI2007]ZAP-Queries (莫比乌斯反演 + 整除分块)

    整理的算法模板合集: ACM模板 题目传送门 本题中数据为5e4,我们只需要筛一次5e4就行了. 双倍经验的P4450 双亲数中数据达到了1e6,我们直接筛1e6的莫比乌斯函数有点不可取,因为只有一组 ...

  3. 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 ...

  4. HDU 6833 莫比乌斯反演 + 数论分块

    给定下列式子: ∑a1=1n∑a2=1n...∑ax=1n(∏j=1xajk)f(gcd⁡(a1,a2...,ax))⋅gcd⁡(a1,a2...,ax)\sum_{a_1=1}^n\sum_{a_2 ...

  5. 小A的数学题(莫比乌斯反演数论)

    小A的数学题(莫比乌斯反演&数论) 1.容斥 原始化简为 ∑ d = 1 n d 2 ∑ i = 1 n ∑ j = 1 m [ g c d ( i , j ) = d ] \sum\limi ...

  6. 【bzoj 2820】YY的GCD(莫比乌斯反演)

    传送门biu~ 参考博客:莫比乌斯反演 #include<bits/stdc++.h> #define N 10000000 using namespace std; int T,n,m, ...

  7. 欧拉函数+狄利克雷卷积+莫比乌斯函数+莫比乌斯反演+整除分块+杜教筛

    Powered by:NEFU AB-IN 文章目录 欧拉函数 狄利克雷卷积 莫比乌斯函数 莫比乌斯反演 P3455 [POI2007]ZAP-Queries 整除分块 P2522 [HAOI2011 ...

  8. BZOJ 1101: [POI2007]Zap( 莫比乌斯反演 )

    求 answer = ∑ [gcd(x, y) = d] (1 <= x <= a, 1 <= y <= b) . 令a' = a / d, b' = b / d, 化简一下得 ...

  9. Luogu P6055 [RC-02] GCD(莫比乌斯反演,杜教筛)(这题乐死我了,真就图一乐呗)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 Weblink https://www.luogu.com.cn/problem/P6055 Prob ...

最新文章

  1. 笨办法学 Python · 续 第五部分:文本解析
  2. 在路上(on the road)
  3. 基于LZ77算法的文件压缩铺垫
  4. Coursera自动驾驶课程第15讲:GNSS and INS Sensing for Pose Estimation
  5. 计算机应用基础 东师 离线,东师1609计算机应用基础离线作业(8页)-原创力文档...
  6. 识别出脸部以及给脸部打马赛克
  7. 开源:OpenJDK8 MIPS64(龙芯)
  8. 三菱je -c中映射表的作用_如何将三菱PLC程序转换成欧姆龙PLC程序?
  9. erp5 主要业务模块介绍
  10. 趋肤效应实验报告_电感耦合等离子体发射光谱实验报告
  11. 电脑录像,如何录制游戏视频 游戏视频录制的方法
  12. java中set,get用法
  13. 解决电脑无法自动获取IP地址
  14. 『DL笔记』预训练(pre-training/trained)与微调(fine tuning)
  15. 计算机等级考试——三级网络技术
  16. docker 批量垃圾清理
  17. php laravel lumen ELK日志采集系统安装
  18. 项目管理,用SAP还是8thManage?
  19. 直戳心窝的日常单品搭配指南,精致girl必看
  20. 阿里云服务器安装桌面UI显示黑屏

热门文章

  1. 重磅 | 吴恩达新书《Machine Learning Yearning》1-52 最新章节分享
  2. Coursera吴恩达《序列模型》课程笔记(3)-- Sequence models Attention mechanism
  3. 连表查询使用in_SQL 组合查询
  4. [Embeding-1]Efficient Estimation of Word Representations in Vector Space 译文
  5. Vs2010中删除空行
  6. 在 C++ 中实现一个轻量的标记清除 gc 系统
  7. asp.net中各种类型文件解析 收藏
  8. 转 ajax.dll 与 ajaxpro.dll的用法
  9. 使用fyne绘制一个交通图标
  10. 【CyberSecurityLearning 7】AD域