P3455 [POI2007]ZAP-Queries(莫比乌斯反演)
题目
解析
莫比乌斯反演。
给定\(n\),\(m\),\(d\),求$$\sum_{i=1}{n}\sum_{j=1}{m}[gcd(i,j)=d]$$
那我们设$$f(x)=\sum_{i=1}{n}\sum_{j=1}{m}[gcd(i,j)=x]$$
设
F(x)=& \sum_{x\mid i}f(k) \\Q
=&\sum_{x\mid k}\sum_{i=1}^{n}\sum_{j=1}^{m}[gcd(i,j)=k]\\
&当gcd(i,j)=k且x\mid i时,会对答案做一次贡献;\\
&所以只要枚举gcd(i,j),当x\mid (k=gcd(i,j))时,会对答案做一次贡献\\
=&\sum_{i=1}^{n}\sum_{j=1}^{m}[x\mid gcd(i,j)]\\
&\because x\mid gcd(i,j)\\
&\therefore x\mid i且x\mid j\\
=&\sum_{i=1}^{\frac{n}{x}}\sum_{j=1}^{\frac{m}{x}}[1\mid gcd(i,j)]\\
=&\lfloor \frac{n}{x}\rfloor \lfloor\frac{m}{x}\rfloor
\end{aligned}
\]
实在看不懂的话其实也可以这么理解,根据\(gcd\)的性质,发现\(F\)实际上就是在求有多少个\(ij\)都是\(x\)的倍数,\(1\)到\(n\)里有\(\lfloor\dfrac{n}{x}\rfloor\)个,\(1\)到\(m\)里有\(\lfloor\dfrac{m}{x}\rfloor\)个,根据乘法原理,就是\(\lfloor\dfrac{n}{x}\rfloor\lfloor\dfrac{m}{x}\rfloor\)。
然后直接反演
F(x)=& \sum_{x\mid i}f(i) \\
f(x)=&\sum_{x\mid i}\mu(\frac{i}{x})F(i)\\
=&\sum_{x\mid i}\mu(\frac{i}{x})\lfloor \frac{n}{i}\rfloor \lfloor\frac{m}{i}\rfloor
\end{aligned}
\]
将\(d\)带入
f(x)=\sum_{d\mid i}\mu(\frac{i}{d})\lfloor \frac{n}{i}\rfloor \lfloor\frac{m}{i}\rfloor
\end{aligned}
\]
令\(\dfrac{i}{d}=t\),得到
f(d)=\sum_{t=1}^{min(a,b)}\mu(t)\lfloor \frac{n}{td}\rfloor \lfloor\frac{m}{td}\rfloor
\end{aligned}
\]
这样就做到了\(O(n)\)的做,最后套一个数论分块,就可以\(O(m\sqrt n)\)的做这道题
代码
#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 + 10;
int t, n, m, d, num, mx, ans;
int mu[N], p[N], sum[N];
bool vis[N];
template<class T>inline void read(T &x) {
x = 0; int f = 0; char ch = getchar();
while (!isdigit(ch)) f |= (ch == '-'), ch = getchar();
while (isdigit(ch)) x = x * 10 + ch - '0', ch = getchar();
x = f ? -x : x;
return;
}
void get_mu(int n) {
mu[1] = 1;
for (int i = 2; i <= n; ++i) {
if (!vis[i]) p[++num] = i, mu[i] = -1;
for (int j = 1; j <= num; ++j) {
if (i * p[j] > n) break;
vis[i * p[j]] = 1;
if (i % p[j] == 0) {
mu[i * p[j]] = 0;
break;
} else mu[i * p[j]] = -mu[i];
}
}
}
int main() {
get_mu(N);
for (int i = 1; i <= N; ++i) sum[i] = sum[i - 1] + mu[i];
read(t);
while (t--) {
ans = 0;
read(n), read(m), read(d);
mx = min(n, m);
for (int l = 1, r; l <= mx; l = r + 1) {
r = min(n / (n / l), m / (m / l));
ans += ((n / (l * d)) * (m / (l * d)) * (sum[r] - sum[l - 1]));
}
printf("%d\n", ans);
}
return 0;
}
P3455 [POI2007]ZAP-Queries(莫比乌斯反演)的更多相关文章
- 【BZOJ】1101 [POI2007]Zap(莫比乌斯反演)
题目 传送门:QWQ 分析 莫比乌斯反演. 还不是很熟练qwq 代码 //bzoj1101 //给出a,b,d,询问有多少对二元组(x,y)满足gcd(x,y)=d.x<=a,y<=b # ...
- BZOJ1101 POI2007 Zap 【莫比乌斯反演】
BZOJ1101 POI2007 Zap Description FGD正在破解一段密码,他需要回答很多类似的问题:对于给定的整数a,b和d,有多少正整数对x,y,满足x<=a,y<=b, ...
- 【BZOJ1101】[POI2007] Zap(莫比乌斯反演)
点此看题面 大致题意: 求\(\sum_{x=1}^N\sum_{y=1}^M[gcd(x,y)==d]\). 一道类似的题目 推荐先去做一下这道题:[洛谷2257]YY的GCD,来初步了解一下莫比乌 ...
- 洛谷P3455 [POI2007]ZAP-Queries (莫比乌斯反演)
题意:求$\sum_{i=1}^{a}\sum_{j=1}^{b}[gcd(i,j)==d]$(1<=a,b,d<=50000). 很套路的莫比乌斯反演. $\sum_{i=1}^{n}\ ...
- 洛谷P3455 [POI2007]ZAP-Queries(莫比乌斯反演)
传送门 设$$f(k)=\sum_{i=1}^{a}\sum_{j=1}^{b}[gcd(i,j)=k]$$ $$g(n)=\sum_{n|k}f(k)=\lfloor\frac{a}{n}\rflo ...
- BZOJ 1101 [POI2007]Zap(莫比乌斯反演)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1101 [题目大意] 求[1,n][1,m]内gcd=k的情况 [题解] 考虑求[1,n ...
- P3455 [POI2007]ZAP-Queries(莫比乌斯反演)
思路 和YY的GCD类似但是更加简单了 类似的推一波公式即可 \[ F(n)=\sum_{n|d}f(d) \] \[ f(n)=\sum_{n|d}\mu(\frac{d}{n})F(d) \] \ ...
- ☆ [POI2007] ZAP-Queries 「莫比乌斯反演」
题目类型:莫比乌斯反演 传送门:>Here< 题意:求有多少对正整数对\((a,b)\),满足\(0<a<A\),\(0<b<B\),\(gcd(a,b)=d\) ...
- [luogu3455][POI2007]ZAP-Queries【莫比乌斯反演】
题目描述 FGD正在破解一段密码,他需要回答很多类似的问题:对于给定的整数a,b和d,有多少正整数对x,y,满足x<=a,y<=b,并且gcd(x,y)=d.作为FGD的同学,FGD希望得 ...
- 【BZOJ】1101: [POI2007]Zap(莫比乌斯+分块)
http://www.lydsy.com/JudgeOnline/problem.php?id=1101 无限膜拜数论和分块orz 首先莫比乌斯函数的一些性质可以看<初等数论>或<具 ...
随机推荐
- 为什么AI的翻译水平还远不能和人类相比?
为什么AI的翻译水平还远不能和人类相比? https://mp.weixin.qq.com/s/0koIt-qu9IOVxNhbFcZr1Q 作者 | SHARON ZHOU 译者 | 王天宇 编辑 ...
- 广州.NET微软技术俱乐部休闲活动 - 每周三五晚周日下午爬白云山活动
基于如下原因: 正如我们在<广州.NET微软技术俱乐部与其他技术群的区别>里面提到的:有人在活动中表达"少了一点自由交流的时间, 我们来自五湖四海, 希望多点时间彼此认识&quo ...
- RelativeLayout设置wrap_content无效
尊重劳动成果,转载请标明出处:http://www.cnblogs.com/tangZH/p/8419053.html 在做项目的过程中,遇到了一个奇怪的现象,我设置RelativeLayout为的宽 ...
- Android 网络框架 Retrofit2
概述 Retrofit是一个OkHttp网络请求框架的封装库,Retrofit通过注解配置网络参数,可以按照我们的规则去构造实际的HTTP请求,能够灵活设置URL.头部.请求体.返回值等,是目前最优雅 ...
- Xamarin移动开发的优点和缺点
在考虑iOS或Android应用程序开发时,我们大多数人会首先考虑Objective-C vs Swift和Java.作为本地技术堆栈,当涉及到iOS和Android应用程序开发时,它们自然是最常用的 ...
- SQLServer之创建视图
视图定义 视图是一个虚拟的表,是一个表中的数据经过某种筛选后的显示方式,视图由一个预定义的查询select语句组成. 使用SSMS数据库管理工具创建视图 1.连接数据库,选择数据库,展开数据库-> ...
- c/c++ linux epoll系列1 创建epoll
linux epoll系列1 创建epoll 据说select和poll的弱点是,随着连接(socket)的增加,性能会直线下降. epoll不会随着连接(socket)的增加,性能直线下降. 知识点 ...
- python--多继承
多继承 子类可以拥有多个父类,继承所有父类的属性和方法 class 子类名(父类名1,父类名2): 多个父类直接不要有重名的方法和属性,子类对象调用,没法确认.
- Spring Boot使用注解实现AOP
第一步: 添加依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId& ...
- 初学Django项目可能会遇到的问题
1. 出现莫名其妙的 app01 我项目中的app名字并不是app01,可是运行python manage.py makemigrations的时候总是提示app01不是已安装的app Applyin ...