洛谷P2257 YY的GCD


标签

  • 莫比乌斯反演
  • 线性筛

前言

  • 这题貌似和莫反没多大关系,就是用到了一个莫比乌斯函数的性质了,其他就是推公式,优化和式。
  • 我的第一道懵逼反演…真的好难好难…而且套路特别多,要多做。可能过段时间我就会觉得特别简单吧!
  • 这一条是我过了3天我再次回到这篇博客里编辑的,我想说,真的挺简单的,无非就是那些更换枚举项,反演替换,筛一下什么什么之类的了。觉得自己三天前太笨了,这么显然的东西都搞了半天…

简明题意

  • 给定n,m,求使得gcd(i,j)的值是素数,有多少对这样的ij

思路

  • 把题目写成公式形式,就是让你求:
    ∑i=1n∑j=1m[gcd(i,j)==p](p是所有质数)\sum_{i=1}^n \sum_{j=1}^m[gcd(i,j)==p](p是所有质数)i=1∑n​j=1∑m​[gcd(i,j)==p](p是所有质数)

    考虑到gcd(i,j)gcd(i,j)gcd(i,j)的值不可能超过min(i,j)min(i,j)min(i,j),因此p的取值应该是min(n,m)min(n,m)min(n,m),也就是p是所有在[1,min(n,m)][1,min(n,m)][1,min(n,m)]范围内的质数,而不是所有质数,但为了简单表述,下文中 “所有质数” 表示在[1,min(n,m)][1,min(n,m)][1,min(n,m)]范围内的所有质数

  • 我们枚举任意质数,也就是把括号中的条件写到式子中,就是
    ∑p:所有质数∑i=1n∑j=1m[gcd(i,j)==p]\sum_{p:所有质数}\sum_{i=1}^n \sum_{j=1}^m[gcd(i,j)==p]p:所有质数∑​i=1∑n​j=1∑m​[gcd(i,j)==p]
  • 根据套路,是要把条件[gcd(i,j)==p][gcd(i,j)==p][gcd(i,j)==p]转换成[gcd(i,j)==1][gcd(i,j)==1][gcd(i,j)==1]的。所以我们套路一下,原式就变成:
    ∑p:所有质数∑i=1[np]∑j=1[mp][gcd(i,j)==1]\sum_{p:所有质数}\sum_{i=1}^{[\frac np]} \sum_{j=1}^{[\frac mp]}[gcd(i,j)==1]p:所有质数∑​i=1∑[pn​]​j=1∑[pm​]​[gcd(i,j)==1]

为什么会有这样的套路呢?因为gcd(i,j)==1gcd(i,j)==1gcd(i,j)==1这样的式子往往更好化简或干一些其他的事情,所以通常见到gcd(i,j)==pgcd(i,j)==pgcd(i,j)==p就更换枚举上界,使它变成gcd(i,j)==1gcd(i,j)==1gcd(i,j)==1

  • 然后莫比乌斯函数有一个极其重要的结论
    ∑d∣nμ(d)=[n==1]\sum_{d|n} \mu(d)=[n==1]d∣n∑​μ(d)=[n==1]

对于一个整数n>1n>1n>1,他的所有约数的莫比乌斯函数值之和,都是0,而1的所有约数莫比乌斯函数之和是1

  • 现在我们把这里的nnn替换成gcd(i,j)gcd(i,j)gcd(i,j),我们就得到了下面的式子
    ∑d∣gcd(i,j)μ(d)=[gcd(i,j)==1]\sum_{d|gcd(i,j)} \mu(d)=[gcd(i,j)==1]d∣gcd(i,j)∑​μ(d)=[gcd(i,j)==1]
  • 然后我们把它代回原式,可以得:
    ∑p:所有质数∑i=1[np]∑j=1[mp]∑d∣gcd(i,j)μ(d)\sum_{p:所有质数}\sum_{i=1}^{[\frac np]} \sum_{j=1}^{[\frac mp]} \sum_{d|gcd(i,j)} \mu(d)p:所有质数∑​i=1∑[pn​]​j=1∑[pm​]​d∣gcd(i,j)∑​μ(d)
  • 然后我们把∑d∣gcd(i,j)μ(d)\sum_{d|gcd(i,j)} \mu(d)∑d∣gcd(i,j)​μ(d)写到条件中去,去枚举每一个d,显然gcd(i,j)&lt;=min(n,m)gcd(i,j)&lt;=min(n,m)gcd(i,j)<=min(n,m),也就是d&lt;=min(n,m)d&lt;=min(n,m)d<=min(n,m),但我们现在的上下界不是nm,而是[np],[mp][\frac np],[\frac mp][pn​],[pm​]因此,d&lt;=min([np],[mp])d&lt;=min([\frac np],[\frac mp])d<=min([pn​],[pm​]),原式变成:
    ∑p:所有质数∑d=1d&lt;=min([np],[mp])∑i=1[np]∑j=1[mp](μ(d)∗[d∣gcd(i,j)])\sum_{p:所有质数}\sum _{d=1}^{d&lt;=min([\frac np],[\frac mp])} \sum_{i=1}^{[\frac np]} \sum_{j=1}^{[\frac mp]} \left(\mu(d) * [d|gcd(i,j)] \right)p:所有质数∑​d=1∑d<=min([pn​],[pm​])​i=1∑[pn​]​j=1∑[pm​]​(μ(d)∗[d∣gcd(i,j)])

发现了吗,这一步实际上就是把∑d∣gcd(i,j)μ(d)\sum_{d|gcd(i,j)} \mu(d)∑d∣gcd(i,j)​μ(d),和式中的判断语句写到条件中

  • 接下来,我们可以移项,移动μ(d)\mu(d)μ(d)那一项,然后就成了:
    ∑p:所有质数∑d=1d&lt;=min([np],[mp])(μ(d)∗∑i=1[np]∑j=1[mp][d∣gcd(i,j)])\sum_{p:所有质数}\sum _{d=1}^{d&lt;=min([\frac np],[\frac mp])} \left( \mu(d) * \sum_{i=1}^{[\frac np]} \sum_{j=1}^{[\frac mp]}[d|gcd(i,j)] \right)p:所有质数∑​d=1∑d<=min([pn​],[pm​])​⎝⎛​μ(d)∗i=1∑[pn​]​j=1∑[pm​]​[d∣gcd(i,j)]⎠⎞​

∑i=1[np]∑j=1[mp]μ(d)\sum\limits_{i=1}^{[\frac np]} \sum \limits_{j=1}^{[\frac mp]} \mu(d)i=1∑[pn​]​j=1∑[pm​]​μ(d)式子中,枚举项是i和j,与d无关,因此与d有关的项可以任意移动。也就是与枚举项无关的式子可以任意移项

  • 下一步,我们关注这个式子:∑i=1[np]∑j=1[mp][d∣gcd(i,j)]\sum\limits_{i=1}^{[\frac np]} \sum \limits_{j=1}^{[\frac mp]} [d |gcd(i,j)]i=1∑[pn​]​j=1∑[pm​]​[d∣gcd(i,j)],实际上,d∣gcd(i,j)d|gcd(i,j)d∣gcd(i,j)等价于[d∣i且d∣j][d|i 且d|j][d∣i且d∣j],具体原因可以自行思考(但这个是经常用的,要熟知),所以这个式子就能变成:
    ∑i=1[np]∑j=1[mp][d∣i且d∣j]\sum\limits_{i=1}^{[\frac np]} \sum \limits_{j=1}^{[\frac mp]} [d|i 且 d|j]i=1∑[pn​]​j=1∑[pm​]​[d∣i且d∣j]
  • 对于式子∑i=1n[d∣i]\sum \limits_{i=1}^n[d|i]i=1∑n​[d∣i],表示d是i的约数的个数,显然d,2d,3d…这些是i的倍数,所以一共就有[nd][\frac nd][dn​]个,所以∑i=1[np][d∣i]=[npd]\sum \limits_{i=1}^{[\frac np]}[d|i]=[\frac n{pd}]i=1∑[pn​]​[d∣i]=[pdn​],而现在需要d同时是ij的约数,因此答案就是[npd]∗[mpd][\frac n{pd}]*[\frac m{pd}][pdn​]∗[pdm​],这样一来,我们和最后两个∑∑\sum\sum∑∑说拜拜,原式就成了
    ∑p:所有质数∑d=1d&lt;=[np](μ(d)∗[npd]∗[mpd])\sum_{p:所有质数}\sum _{d=1}^{d&lt;=[\frac np]} \left( \mu(d) * [\frac n{pd}]*[\frac m{pd}] \right)p:所有质数∑​d=1∑d<=[pn​]​(μ(d)∗[pdn​]∗[pdm​])
  • 这时,复杂度大概是O(质数个数∗[np])O(质数个数*[\frac np])O(质数个数∗[pn​]),最后可以拿到50分。接下来,我们考虑优化。首先我们有下面的式子:
    ∑i=1n∑j=1[ni]f(ij)∗g(i)∗h(j)=∑k=1nf(k)∗∑d∣kg([kd])h(d)\sum_{i=1}^n\sum_{j=1}^{[\frac ni]}f(ij)*g(i)*h(j)=\sum_{k=1}^nf(k)*\sum_{d|k}g([\frac kd])h(d)i=1∑n​j=1∑[in​]​f(ij)∗g(i)∗h(j)=k=1∑n​f(k)∗d∣k∑​g([dk​])h(d)

令k=ijk=ijk=ij,然后枚举kkk。这里的iii可以不从1枚举到n,可以是任意数,前提是保证后面的d和i性质一样(比如i是[1,n]范围内的质数,那么d|k且d是质数),且计算时保证关于i的函数和关于d的函数是同一性质(还是刚才的例子,式子左边是g(i),右边以d作为自变量的也应该是g而不应该是h,但如果i是顺序从1枚举到n则没有这个限制)

  • 所以我们可以令k=pdk=pdk=pd把原始改为枚举kkk的形式。根据上面所说的,μ()\mu()μ()的自变量就应该是μ(kd)\mu(\frac kd)μ(dk​)而不是μ(d)\mu(d)μ(d)(其他题解都说要改为枚举k,但都没有说为什么,上面就是原因)
    ∑k=1n[nk][mk]∗∑d∣k且d∈primeμ(kd)\sum_{k=1}^n[\frac nk][\frac mk]*\sum_{d|k且d \in prime}\mu(\frac kd)k=1∑n​[kn​][km​]∗d∣k且d∈prime∑​μ(dk​)
  • 如果直接计算这个式子,会发现∑d∣k且d∈primeμ(kd)\sum\limits_{d|k且d \in prime}\mu(\frac kd)d∣k且d∈prime∑​μ(dk​)的前缀和比较难处理。现在问题就在于处理下面式子的前缀和:
    f(k)=∑d∣k且d∈primeμ(kd)f(k)=\sum\limits_{d|k且d \in prime}\mu(\frac kd)f(k)=d∣k且d∈prime∑​μ(dk​)
  • 显然又是贡献法枚举了,枚举所有的d(且d是质数),然后d会对所有d的倍数f(kd)f(kd)f(kd)产生贡献,这样一来就把f(k)f(k)f(k)处理完了,然后前缀和一下。预处理复杂度是O(约数个数∗np)(p是指每一个约数)O(约数个数*\frac np)(p是指每一个约数)O(约数个数∗pn​)(p是指每一个约数),总复杂度就是O(约数个数∗np+Tn)O(约数个数*\frac np + T\sqrt n)O(约数个数∗pn​+Tn​),这样能拿到100分,但是可以进一步优化。

这里有一个小注意事项,就是整除分块里面的l和r必须用int,用long long就会超时…



分鸽线(上面就已经做完了,下面是一点优化,个人认为挺重要的,需要掌握)不加下面的优化大概15s,加了下面的优化就是10s



f(k)=∑d∣k且d∈primeμ(kd)f(k)=\sum\limits_{d|k且d \in prime}\mu(\frac kd)f(k)=d∣k且d∈prime∑​μ(dk​)

  • 上式我们枚举的是什么?是k的所有质因子。于是就把f(k)f(k)f(k)换成唯一分解形式:
    f(k)=μ(kp1)+μ(kp2)+...+μ(kpn)f(k)=\mu (\frac k{p_1})+\mu (\frac k{p_2})+...+\mu (\frac k{p_n})f(k)=μ(p1​k​)+μ(p2​k​)+...+μ(pn​k​)
  • 然后发现f(k)f(k)f(k)显然可以线性筛鸭!然后我们就线性筛,最终复杂度就是O(n+Tn)O(n + T\sqrt n)O(n+Tn​)
  • 最后,我讲一下这里的线性筛:
  • 就举个例子吧,假设现在枚举的数是k=30,分解质因数后是
    k=21∗31∗51k=2^1*3^1*5^1k=21∗31∗51
  • 那么f(30)=μ(302)+μ(303)+μ(305)f(30)=\mu(\frac {30}2)+\mu(\frac {30}3)+\mu(\frac {30}5)f(30)=μ(230​)+μ(330​)+μ(530​)
    1. i%prime[j]==0i\%prime[j]==0i%prime[j]==0
      在这个例子里prime[j]prime[j]prime[j]只能等于2(不知道为什么只有2?因为线性筛只会枚举<= i的最小质因子 的质数…),我们就假设现在枚举的质数是2,然后分解质因数是:
      k=22∗31∗51k=2^2*3^1*5^1k=22∗31∗51
      现在去枚举k的质因子p,发现,除了2,对于任意的p,kp\frac kppk​一定含有平方因子,也就是除了质因子2的,其他质因子的贡献都变成了0,所以i∗prime[j]=μ(i)i * prime[j]=\mu(i)i∗prime[j]=μ(i)
    2. i%prime[j]!=0i\%prime[j]!=0i%prime[j]!=0
      这样的话,相当于多加了一个质因子,所以我们只用加上这个质因子的贡献μ(kprime[j])\mu(\frac k{prime[j]})μ(prime[j]k​)。如果你信了的话,就错啦。并不是只用加上这个质因子的贡献的,因为k变大了,其他的质因子的贡献也变化了。每一个的质因子的μ(kd)\mu(\frac kd)μ(dk​)中kd\frac kddk​都扩大了prime[j]prime[j]prime[j]倍,所以根据莫比乌斯函数的性质,增加了一个原来没有的质因子,值应该取反。于是变成f[i∗prime[j]]=−f(i)f[i * prime[j]]=-f(i)f[i∗prime[j]]=−f(i)…还没完,现在还新增了一个质数prime[j],他的贡献是μ(i∗prime[j]prime[j])\mu(\frac {i*prime[j]}{prime[j]})μ(prime[j]i∗prime[j]​)也就是μ[i]\mu[i]μ[i],所以f[i∗prime[j]]=−f(i)+μ[i]f[i * prime[j]]=-f(i)+\mu[i]f[i∗prime[j]]=−f(i)+μ[i]
    3. i是质数
      这个就太简单了,显然质数只有一个约数就是自己,所有值就是μ(1)=1\mu(1)=1μ(1)=1
    • 完结~

注意事项

  • 就是整除分块里面的l和r必须用int,用long long就会超时…

总结

  • 遇到枚举项中出现诸如[gcd(i,j)==1]的条件式,可以考虑用∑\sum∑
  • [d∣gcd(i,j)]等价于[d∣i且d∣j][d|gcd(i,j)]等价于[d|i且d|j][d∣gcd(i,j)]等价于[d∣i且d∣j]
  • ∑d∣nμ(d)=[n==1]\sum \limits_{d|n} \mu(d)=[n==1]d∣n∑​μ(d)=[n==1]这个结论极其重要。可以用这个等式替换条件式
  • 就是整除分块里面的l和r必须用int,用long long就会超时…
  • 下面这一个我认为是这篇题解里最有营养的
    ∑i=1n∑j=1[ni]f(ij)∗g(i)∗h(j)=∑k=1nf(k)∗∑d∣kg([kd])h(d)\sum_{i=1}^n\sum_{j=1}^{[\frac ni]}f(ij)*g(i)*h(j)=\sum_{k=1}^nf(k)*\sum_{d|k}g([\frac kd])h(d)i=1∑n​j=1∑[in​]​f(ij)∗g(i)∗h(j)=k=1∑n​f(k)∗d∣k∑​g([dk​])h(d)

令k=ijk=ijk=ij,然后枚举kkk。这里的iii可以不从1枚举到n,可以是任意数,前提是保证后面的d和i性质一样(比如i是[1,n]范围内的质数,那么d|k且d是质数),且计算时保证关于i的函数和关于d的函数是同一性质(还是刚才的例子,式子左边是g(i),右边以d作为自变量的也应该是g而不应该是h,但如果i是顺序从1枚举到n则没有这个限制)

  • 见到∑d∣n且d∈prime\sum\limits_{d|n且d \in prime}d∣n且d∈prime∑​,就是在枚举n的所有质因子,看到这样的式子脑子里一定要立马蹦出线性筛鸭!!!

AC代码

#include<cstdio>
#include<algorithm>
using namespace std;const int maxn = 1e7 + 10;bool no_prime[maxn];
int prime[maxn], mu[maxn], f[maxn], pre[maxn];
int shai(int n)
{int cnt = 0;mu[1] = 1;for (int i = 2; i <= n; i++){if (!no_prime[i])prime[++cnt] = i, mu[i] = -1, f[i] = 1;for (int j = 1; j <= cnt && prime[j] * i <= n; j++){no_prime[i * prime[j]] = 1;mu[i * prime[j]] = i % prime[j] == 0 ? 0 : -mu[i];f[i * prime[j]] = i % prime[j] == 0 ? mu[i] : mu[i] - f[i];if (i % prime[j] == 0) break;}}for (int i = 1; i <= n; i++)pre[i] = pre[i - 1] + f[i];return cnt;
}long long cal(int n, int m)
{int  l = 1, r; long long ans = 0;while (l <= n){r = min(n / (n / l), m / (m / l));ans += (1ll * n / l) * (m / l) * (long long)(pre[r] - pre[l - 1]);l = r + 1;}return ans;
}int n, m;void solve()
{shai(maxn - 10);int t;scanf("%d", &t);while (t--){scanf("%d%d", &n, &m);if (n > m) swap(n, m);printf("%lld\n", cal(n, m));}
}int main()
{solve();return 0;
}

洛谷P2257 YY的GCD 莫比乌斯函数反演+线性筛相关推荐

  1. [洛谷P2257] YY的GCD (莫比乌斯反演)

    YY的GCD 题目描述 神犇YY虐完数论后给傻×kAc出了一题 给定N, M,求1<=x<=N, 1<=y<=M且gcd(x, y)为质数的(x, y)有多少对 kAc这种傻× ...

  2. [Luogu P2257] YY的GCD (莫比乌斯函数)

    题面 传送门:洛咕 Solution 推到自闭,我好菜啊 显然,这题让我们求: \(\large \sum_{i=1}^{n}\sum_{j=1}^{m}[gcd(i,j)\in prime]\) 根 ...

  3. 洛谷 P2257 YY的GCD

    YY的GCD 题目描述 神犇YY虐完数论后给傻×kAc出了一题 给定\(N\), \(M\) ,求\(1 \le x \le N,1 \le y \le M\)且\(gcd(x, y)\)为质数的\( ...

  4. 洛谷P2257 YY的GCD

    题目描述 神犇YY虐完数论后给傻×kAc出了一题 给定N, M,求1<=x<=N, 1<=y<=M且gcd(x, y)为质数的(x, y)有多少对 kAc这种傻×必然不会了,于 ...

  5. P2257 YY的GCD

    P2257 YY的GCD 题意: 求 1≤x≤N,1≤y≤M1 \leq x \leq N,1 \leq y \leq M1≤x≤N,1≤y≤M 且gcd(x, y) 为质数的 (x,y) 有多少对. ...

  6. 洛谷 P2186 小Z的栈函数

    洛谷 P2186 小Z的栈函数 题目 题目描述 小Z最近发现了一个神奇的机器,这个机器的所有操作都是通过维护一个栈来完成的,它支持如下11个操作: NUM X:栈顶放入X. POP:抛弃栈顶元素. I ...

  7. 【bzoj2694】Lcm 莫比乌斯反演+线性筛

    题目描述 求$\sum\limits_{i=1}^n\sum\limits_{j=1}^m|\mu(gcd(i,j))|lcm(i,j)$,即$gcd(i,j)$不存在平方因子的$lcm(i,j)$之 ...

  8. 【bzoj2693】jzptab 莫比乌斯反演+线性筛

    题目描述 输入 一个正整数T表示数据组数 接下来T行 每行两个正整数 表示N.M 输出 T行 每行一个整数 表示第i组数据的结果 样例输入 1 4 5 样例输出 122 题解 莫比乌斯反演+线性筛 由 ...

  9. YY的GCD(洛谷-P2257)

    题目描述 神犇YY虐完数论后给傻×kAc出了一题 给定N, M,求1<=x<=N, 1<=y<=M且gcd(x, y)为质数的(x, y)有多少对 kAc这种傻×必然不会了,于 ...

最新文章

  1. tensorflow 代码阅读
  2. 安装texlive并用latex编写一段中文,最后生成pdf文件
  3. Django 3.2.5博客开发教程:体验django模板
  4. aop简介-基于jdk的动态代理
  5. 在ARM Linux下使用GPIO模拟SPI时序详解
  6. 除了HTML、CSS与JS,现在WASM也是标准Web语言
  7. 深入理解java虚拟机--线程安全与锁优化
  8. web开发发送短信实现最简单的接口
  9. Java基础——String类(二)
  10. SQL 的基本使用概念简介
  11. 几维安全:千锤百炼,锻造移动游戏安全防护黄金铠甲
  12. Python命令行版本的员工管理系统
  13. 31. Magento图片大小调整的相关代码
  14. 随机出题 c语言编程,在Excel中制作单机版随机出题考试系统
  15. 小程序页面收录 sitemap
  16. html+css基础教程之CSS 透明边框和样式
  17. Quirks(怪癖)模式是什么?它和Standards(标准)模式有什么区别
  18. 区块链的底层技术:P2P网络原理与应用详解
  19. 如何更换计算机cpu风扇,cpu风扇怎么拆下来 cpu风扇正确拆卸方法图解
  20. 音标、音节、音素、音符

热门文章

  1. FBX导入虚幻5_详解
  2. 海南计算机发展前景,海南计算机网络应用的发展前景,电子商务
  3. 小米智能手环只卖13美元,太便宜了!
  4. CentOS7环境安装Kubernetes四部曲之四:安装kubectl工具
  5. 零基础学Web 04(style标签)
  6. 惠普暗夜精灵7和联想拯救者R9000P2021有什么区别 哪个好详细性能配置对比
  7. 《荔枝架构实践与演进历程》读后感
  8. eclipse皮肤修改
  9. 你了解西湖吗? 最新最全介绍西湖的历史和现在
  10. 八鲸诚教您抖音小店怎么选品