【ybt金牌导航8-7-1】数对统计 / 关于莫比乌斯函数的少量内容
数对统计
题目链接:ybt金牌导航8-7-1
题目大意
给你 n,m,求 gcd(x,y)=1 的数对个数。
1<=x<=n,1<=y<=m
思路
莫比乌斯函数
什么东西
首先我们要知道莫比乌斯函数是个什么鬼东西。
首先,我们先不管莫比乌斯函数,先来看一个函数:F(n)=∑d∣nf(d)F(n)=\sum_{d|n}f(d)F(n)=∑d∣nf(d)
(假设 f(d)f(d)f(d) 是一个给出的函数)
那根据定义,我们可以先弄一下:
F(1)=f(1)F(1)=f(1)F(1)=f(1)
F(2)=f(1)+f(2)F(2)=f(1)+f(2)F(2)=f(1)+f(2)
F(3)=f(1)+f(3)F(3)=f(1)+f(3)F(3)=f(1)+f(3)
F(4)=f(1)+f(2)+f(4)F(4)=f(1)+f(2)+f(4)F(4)=f(1)+f(2)+f(4)
F(5)=f(1)+f(5)F(5)=f(1)+f(5)F(5)=f(1)+f(5)
F(6)=f(1)+f(2)+f(3)+f(6)F(6)=f(1)+f(2)+f(3)+f(6)F(6)=f(1)+f(2)+f(3)+f(6)
F(7)=f(1)+f(7)F(7)=f(1)+f(7)F(7)=f(1)+f(7)
F(8)=f(1)+f(2)+f(4)+f(8)F(8)=f(1)+f(2)+f(4)+f(8)F(8)=f(1)+f(2)+f(4)+f(8)
那我们考虑用 F(n)F(n)F(n) 来推 f(n)f(n)f(n)
f(1)=F(1)f(1)=F(1)f(1)=F(1)
f(2)=F(2)−F(1)f(2)=F(2)-F(1)f(2)=F(2)−F(1)
f(3)=F(3)−F(1)f(3)=F(3)-F(1)f(3)=F(3)−F(1)
f(4)=F(4)−F(2)f(4)=F(4)-F(2)f(4)=F(4)−F(2)
f(5)=F(5)−F(1)f(5)=F(5)-F(1)f(5)=F(5)−F(1)
f(6)=F(6)−F(3)−F(2)+F(1)f(6)=F(6)-F(3)-F(2)+F(1)f(6)=F(6)−F(3)−F(2)+F(1)
f(7)=F(7)−F(1)f(7)=F(7)-F(1)f(7)=F(7)−F(1)
f(8)=F(8)−F(4)f(8)=F(8)-F(4)f(8)=F(8)−F(4)
那我们会发现,它只会由它因数的 FFF 值加减或者不要组成。
那我们可以把它弄成这样的形式:
f(n)=∑d∣nμ(d)F(nd)f(n)=\sum_{d|n}\mu(d)F(\frac{n}{d})f(n)=∑d∣nμ(d)F(dn)
那我们的莫比乌斯函数 μ(d)\mu(d)μ(d) 就出现了!
定义
- 如果 d=1d=1d=1,那 μ(d)=1\mu(d)=1μ(d)=1
- 如果 d=p1p2...pkd=p_1p_2...p_kd=p1p2...pk,pip_ipi 是互不相同的素数,那就会有 μ(d)=(−1)k\mu(d)=(-1)^kμ(d)=(−1)k
- 如果不满足上面两个条件,那 μ(d)=0\mu(d)=0μ(d)=0
如何求
首先,我们可以很明显的看出用定义法求会比较慢,尤其是要求一个区间的。
我们可以考虑用类似 DP 的方法求。
看到跟素数有关,自然想到先用欧拉筛求。
然后我们可以考虑,在欧拉筛枚举最小质因子的时候,我们可以想到你处理 i×primeji\times prime_ji×primej 这个数。
那我们想 primejprime_jprimej 的 μ\muμ 值已经求出,那我们可以看这个最小的质因子是否已经是 primejprime_jprimej 的因子(就是能否整除)。
如果能整除,那就说明这个质数有两个,那就直接 μi×primej=0\mu_{i\times prime_j}=0μi×primej=0,那否则就是多一个素数,就是 μi×primej=μi×−1\mu_{i\times prime_j}=\mu_{i}\times-1μi×primej=μi×−1。
你会想,啊,如果原来 primejprime_jprimej 已经有一个素数能分解出两个或以上呢?
那因为这样,它的 μ\muμ 值就一定是 000,就算乘了 −1-1−1,也还是 000,就没有问题了。
一些性质
- ∑d∣nμ(d)={1n=10n>1\sum_{d|n}\mu(d)=\left\{\begin{matrix} 1\ \ n=1\\ 0\ \ n>1 \end{matrix}\right.∑d∣nμ(d)={1 n=10 n>1
- φ(n)=∑d∣nμ(d)×nd\varphi(n)=\sum_{d|n}\dfrac{\mu(d)\times n}{d}φ(n)=∑d∣ndμ(d)×n
关于这道题
我们考虑利用第一条性质:
ans=∑i=1n∑j=1m[gcd(i,j)=1]ans=\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{m}[gcd(i,j)=1]ans=i=1∑nj=1∑m[gcd(i,j)=1]
ans=∑i=1n∑j=1m[gcd(i,j)=1]=∑i=1n∑j=1m∑d∣gcd(i,j)μ(d)=∑i=1n∑j=1m∑d∣i,d∣jμ(d)=∑d∑i=1,d∣in∑j=1,d∣jmμ(d)=∑dμ(d)⋅⌊nd⌋⋅⌊md⌋\begin{aligned} ans &= \sum\limits_{i=1}^{n}\sum\limits_{j=1}^{m}[\gcd(i,j)=1]\\ &= \sum\limits_{i=1}^{n}\sum\limits_{j=1}^{m}\sum\limits_{d|\gcd(i,j)}\mu(d)\\ &= \sum\limits_{i=1}^{n}\sum\limits_{j=1}^{m}\sum\limits_{d|i,d|j}\mu(d)\\ &= \sum\limits_{d}\sum\limits_{i=1,d|i}^{n}\sum\limits_{j=1,d|j}^{m}\mu(d)\\ &= \sum\limits_{d}\mu(d)\cdot\left \lfloor \frac{n}{d} \right \rfloor\cdot\left \lfloor \frac{m}{d} \right \rfloor \end{aligned}ans=i=1∑nj=1∑m[gcd(i,j)=1]=i=1∑nj=1∑md∣gcd(i,j)∑μ(d)=i=1∑nj=1∑md∣i,d∣j∑μ(d)=d∑i=1,d∣i∑nj=1,d∣j∑mμ(d)=d∑μ(d)⋅⌊dn⌋⋅⌊dm⌋
然后这就是 O(n)O(n)O(n) 的,但是因为它是多次询问,每个询问都是 O(n)O(n)O(n),就还是过不了。
然后看到向下取整,自然想到整除分块。
那就前缀和 μ\muμ 函数,然后就整除分块处理就好了。
代码
#include<cstdio>
#include<iostream>
#define ll long longusing namespace std;ll T;
ll n, m;
ll miu[100001], prime[100001];
ll qz[100001];
bool np[100001];void get_miu() {//同欧拉筛预处理 μmiu[1] = 1;for (int i = 2; i <= 100000; i++) {if (!np[i]) {prime[++prime[0]] = i;miu[i] = -1;}for (int j = 1; j <= prime[0] && 1ll * i * prime[j] <= 100000ll; j++) {np[i * prime[j]] = 1;if (i % prime[j] == 0) {miu[i * prime[j]] = 0;break;}else miu[i * prime[j]] = miu[i] * -1;}}
}void get_qz() {//前缀和for (int i = 1; i <= 100000; i++)qz[i] = qz[i - 1] + miu[i];
}void work(int n, int m) {ll ans = 0;for (int l = 1; l <= n && l <= m; ) {int r = min(n / (n / l), m / (m / l));//数论分块加速ans += (qz[r] - qz[l - 1]) * (n / l) * (m / l);l = r + 1;}printf("%lld\n", ans);
}int main() {get_miu();get_qz();scanf("%lld", &T);while (T--) {scanf("%lld %lld", &n, &m);work(n, m);}return 0;
}
【ybt金牌导航8-7-1】数对统计 / 关于莫比乌斯函数的少量内容相关推荐
- 【ybt金牌导航8-3-3】【luogu P4593】分数计算 / 教科书般的亵渎(数学)(拉格朗日插值)
分数计算 / 教科书般的亵渎 题目链接:ybt金牌导航8-3-3 / luogu P4593 题目大意 有一些怪,血量从 1~n,其中有 m 个数是没有怪的,给出这些数. 然后你可以每次操作攻击所有怪 ...
- 【ybt金牌导航2-3-3】【luogu P3975】K小子串 / 弦论
K小子串 / 弦论 题目链接:ybt金牌导航2-3-3 / luogu P3975 题目大意 给你一个字符串,要你求字典序第 k 小的子串. (相同的子串可能算一个,也可能算多个,数据以读入 0/1 ...
- 【luogu P4036】【ybt金牌导航4-5-3】火星人
火星人 题目链接:luogu P4036 / ybt金牌导航4-5-3 题目大意 给你一个字符串,要你维护三个东西. 修改字符串的一个字符,往字符串的一个地方插入一个字符,询问两个后缀的最长公共前缀. ...
- 【ybt金牌导航4-7-3】【luogu P3437】三维俄罗斯方块/TET-Tetris 3D
三维俄罗斯方块/TET-Tetris 3D 题目链接:ybt金牌导航4-7-3 / luogu P3437 题目大意 要你支持区间求最大,并把这个区间的所有点高度改为你求得的最大值加一个值. 最后要你 ...
- 【ybt金牌导航3-6-3】【luogu P3007】奶牛议会 / The Continental Cowngress G(两种方法)
奶牛议会 / The Continental Cowngress G 题目链接:ybt金牌导航3-6-3 / luogu P3007 题目大意 有一些人,每个人对众多决案中的两个决案有表示好或不好. ...
- 【ybt金牌导航3-2-1】【luogu P3376】网络最大流【Dinic算法】
网 络 最 大 流 网络最大流 网络最大流 题目链接:ybt金牌导航3-2-1 / luogu P3376 题目 如题,给出一个网络图,以及其源点和汇点,求出其网络最大流. 输入 第一行包含四个正整数 ...
- P4318,bzoj2440-完全平方数【二分答案,莫比乌斯函数,容斥】
正题 题目链接: https://www.luogu.org/problem/P4318 https://www.lydsy.com/JudgeOnline/problem.php?id=2440 题 ...
- 【莫队】区间不同数(金牌导航 莫队-1)
区间不同数 金牌导航 莫队-1 题目大意 给出n个数,然后询问m次,每次询问一个区间内不同的数的个数 样例输入 6 1 2 3 4 3 5 3 1 2 3 5 2 6 样例输出 2 2 4 数据范围 ...
- 【DP】【树状数组】折线统计(金牌导航 数据结构优化DP-1)
正题 金牌导航 数据结构优化DP-1 题目大意 平面上有n个点,让你选择若干点,连接x坐标相邻的点,其中连续上升或下降的为一段,问你有多少中选择方案,使得段数为k 解题思路 设fi,j,0/1f_{i ...
最新文章
- redis 6379端口telnet不通的解决办法
- java - 通用 CRUD(增、删、改、查)工具类,代码高效复用
- PHP逻辑运算符如何写,PHP 逻辑运算符
- 《天天数学》连载36:二月五日
- 系统调用----sandir
- beautifulsoup_如何使用 Python 和 BeautifulSoup 爬取网站
- sqlserver2008r2 还原bak文件
- ACR122U-A9|ACR1251|ACM1252系列NFC读写器读卡器PCSC Tool测试工具使用步骤说明
- 时间序列分析 23 DTW (时序相似度度量算法) 上
- 获取微信开放平台申请移动应用时的应用签名和应用包名
- 玩转Linux与运维岗(21)
- 坐落尘世的繁华,幽眉清黛任花开花谢
- 微信小程序iOS系统上echarts不能滑动的问题
- 【图像增强】基于Step和Polynomial 滤波实现图像增强附matlab代码
- 圣诞节购物季:我们可以花加密货币购买礼物
- Python基础教程第七章学习笔记——更加抽象
- 基于微博的网络安全事件检测
- linux杀毒软件clamav安装
- 切入万亿家居市场,国美是要充当“逆袭者”还是“搅局者”?
- 2022年最流行的自动化测试工具有哪些?全网最全最细都在这里了