题目链接

大意

给定多组\(N\),\(M\),求\(1\le x\le N,1\le y\le M\)并且\(Gcd(x, y)\)为质数的\((x, y)\)有多少对。

思路

我们设\(f(i)\)表示\(Gcd(x,y)=i\)的\((x,y)\)的个数,\(F(i)\)表示\(Gcd(x,y)\%i=0\)的\((x,y)\)的个数。

那么有$$F(i)=\lfloor\frac{N}{i}\rfloor\lfloor\frac{M}{i}\rfloor=\sum_{i\mid d}f(d)$$,

用莫比乌斯反演得到:$$f(i)=\sum_{i\mid d}\mu(\frac{d}{i})\cdot F(d)$$

那么我们要求的\(Ans\)就为:$$Ans=\sum_{p\in prime}f[p]=\sum_{p\in prime}\sum_{p\mid d}\mu(\frac{d}{p})\cdot F(d)$$

即$$Ans=\sum_{p\in prime}\sum_{p\mid d}\mu(\frac{d}{p})\cdot \lfloor\frac{N}{d}\rfloor\lfloor\frac{M}{d}\rfloor$$

上述化简式对于单组数据已经够了,然而,对于多组数据依然有较大的缺陷,考虑优化。

对上述式子变形:$$Ans=\sum_{d=1}^{min(N,M)}\lfloor\frac{N}{d}\rfloor\lfloor\frac{M}{d}\rfloor\cdot(\sum_{p\in prime&p\mid d}\mu(\frac{d}{p}))$$

对于后面的式子,我们可以预先处理好对于每个\(d\)的总和,然后发现前面为一个数论分块,所以可以\(O(T\sqrt{N})\)算。

代码

#include<cstdio>
#include<algorithm>
using namespace std;
const long long ONE=1;
const int MAXV=10000000;
const int MAXN=10000005;
int T,A,B,Miu[MAXN];
long long Sum[MAXN];
int Pcnt,Prime[MAXN],visp[MAXN];
long long Ans;
void Prepare(){
visp[0]=visp[1]=1;Miu[1]=1;
for(int i=2;i<=MAXV;i++){
if(!visp[i]){Prime[++Pcnt]=i;Miu[i]=-1;}
for(int j=1;j<=Pcnt&&i*Prime[j]<=MAXV;j++){
visp[i*Prime[j]]=1;
if(i%Prime[j]==0){
Miu[i*Prime[j]]=0;
break;
}
else Miu[i*Prime[j]]=-Miu[i];
}
}
for(int i=1;i<=Pcnt;i++)
for(int j=1;j*Prime[i]<=MAXV;j++)
Sum[j*Prime[i]]+=Miu[j];
for(int i=1;i<=MAXV;i++)
Sum[i]=Sum[i-1]+Sum[i];
}
int main(){
Prepare();
scanf("%d",&T);
while(T--){Ans=0;
scanf("%d%d",&A,&B);
int lowin=min(A,B);
for(int L=1,R;L<=lowin;L=R+1){
R=min(A/(A/L),B/(B/L));
Ans+=(Sum[R]-Sum[L-1])*(A/L)*(B/L);
}
printf("%lld\n",Ans);
}
}

【BZOJ2820】YY的GCD(莫比乌斯反演 数论分块)的更多相关文章

  1. [BZOJ 2820] YY的gcd(莫比乌斯反演+数论分块)

    [BZOJ 2820] YY的gcd(莫比乌斯反演+数论分块) 题面 给定N, M,求\(1\leq x\leq N, 1\leq y\leq M\)且gcd(x, y)为质数的(x, y)有多少对. ...

  2. Bzoj 2820: YY的GCD(莫比乌斯反演+除法分块)

    2820: YY的GCD Time Limit: 10 Sec Memory Limit: 512 MB Description 神犇YY虐完数论后给傻×kAc出了一题给定N, M,求1<=x& ...

  3. BZOJ2820:YY的GCD(莫比乌斯反演)

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

  4. 洛谷 - P2257 - YY的GCD - 莫比乌斯反演 - 整除分块

    https://www.luogu.org/problemnew/show/P2257 求 \(n,m\) 中 \(gcd(i,j)==p\) 的数对的个数 求 $\sum\limits_p \sum ...

  5. [BZOJ 2154]Crash的数字表格(莫比乌斯反演+数论分块)

    [BZOJ 2154]Crash的数字表格(莫比乌斯反演+数论分块) 题面 求 \[\sum_{i=1}^{n} \sum_{j=1}^{m} \mathrm{lcm}(i,j)\] 分析 \[\su ...

  6. BZOJ2820 YY的GCD 莫比乌斯+系数前缀和

    /** 题目:BZOJ2820 YY的GCD 链接:http://www.cogs.pro/cogs/problem/problem.php?pid=2165 题意:神犇YY虐完数论后给傻×kAc出了 ...

  7. bzoj 2820 YY的GCD 莫比乌斯反演

    题目大意: 给定N, M,求1<=x<=N, 1<=y<=M且gcd(x, y)为质数的(x, y)有多少对 这里就抄一下别人的推断过程了 后面这个g(x) 算的方法就是在线性 ...

  8. 【BZOJ2820】YY的GCD [莫比乌斯反演]

    YY的GCD Time Limit: 10 Sec  Memory Limit: 512 MB[Submit][Status][Discuss] Description 求1<=x<=N, ...

  9. BZOJ 2820: YY的GCD [莫比乌斯反演]【学习笔记】

    2820: YY的GCD Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 1624  Solved: 853[Submit][Status][Discu ...

随机推荐

  1. 大厂必问的JVM面试题

    本文目录: 讲一下JVM内存结构? 程序计数器 虚拟机栈 本地方法栈 堆 方法区 运行时常量池 直接内存 Java对象的定位方式 说一下堆栈的区别? 什么情况下会发生栈溢出? 类文件结构 什么是类加载 ...

  2. html 基础 vscode的常用快捷键

    1.ctrl+/ //注释代码 2.文件内容查找替换:ctrl+f ctrl+h ,替换一个ctrl+shift+1,替换所有ctrl+alt+enter 3.移动当前行,向上alt+up(方向键↑) ...

  3. js 动态设置键值对数组 ,类似于 java 的Map 类型

    1.前言 我想设置一个数据  var json = {a1 :1  , a2 :2  , a3 :3  .....} 这样的动态数据 ,怎么写呢? 2.正确写法 var json = []; for ...

  4. Linux上天之路(四)之Linux界面介绍

    Linux界面 linux为使用者提供了图形界面和文本界面,但是很多操作依然需要文本界面的操作才能完成,很多人使用起来比较蹩脚,又因为linux平台的个人应用APP相对较少,使得大家的个人PC安装了l ...

  5. Hive的分析函数的使用

    原文: https://www.toutiao.com/i6769120000578945544/?group_id=6769120000578945544 我们先准备数据库.表和数据 开窗分析函数相 ...

  6. JavaWeb中Cookie会话管理,理解Http无状态处理机制

    注:图片如果损坏,点击文章链接:https://www.toutiao.com/i6512995108961387015/ 1.<Servlet简单实现开发部署过程> 2.<Serv ...

  7. SYCOJ1018神奇的幻方

    题目-神奇的幻方 (shiyancang.cn) 模拟就对了 因为每一个状态由前一个状态决定,所以只需要记录即可 #include<bits/stdc++.h> using namespa ...

  8. 【系统学习ES6】第二节:解构赋值

    [系统学习ES6] 本专题旨在对ES6的常用技术点进行系统性梳理,帮助大家对其有更好的掌握,希望大家有所收获. ES6允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构.解构是一种打 ...

  9. 封装OCX

    封装OCX的办法有2种: 1. 使用C++的MFC activex项目生成OCX 2. 使用C#的用户控件生成OCX(.net core好像不支持) 注意:以管理员身份运行Visual Studio ...

  10. 《剑指offer》面试题54. 二叉搜索树的第k大节点

    问题描述 给定一棵二叉搜索树,请找出其中第k大的节点.   示例 1: 输入: root = [3,1,4,null,2], k = 1 3 / \ 1 4 \   2 输出: 4 示例 2: 输入: ...