题目大意

有至多\(10000\)组询问,问\(1 < i \leqslant N \leqslant 10000000, 1 < j \leqslant M \leqslant 10000000\),并且\(gcd(i, j)\)为质数的有多少对。

解题思路

为了方便描述,我们定义\([]\),当\([]\)中表达式为真时为\(1\),否则为\(0\)。同时定义\(Prime\)为素数集合。

下面的讨论中,我们不妨设\(N \leqslant M\)。

我们设

\[f(d)=\sum_{i=1}^M\sum_{j=1}^N[gcd( i, j ) \in Prime]\\
F(n)=\sum_{n|d}^Nf(d)=\lfloor\frac{M}{n}\rfloor\lfloor\frac{N}{n}\rfloor
\]

即,\(f(d)\)是当\(gcd=d\)时的答案数,\(F(n)\)是当\(gcd\)为\(n\)的倍数时的答案数。

我们发现,求\(F(n)\)十分的方便,于是我们考虑能否通过\(F(n)\)将\(f(n)\)表述出来。

由莫比乌斯反演,得

\[f(n)=\sum_{n|d}\mu(\frac{d}{n})F(d)
\]

其中\(\mu\)是莫比乌斯函数。

那么答案就可以表示为

\[\begin{aligned}
Ans & = \sum_{n\in Prime}^Nf(n)\\
& = \sum_{n\in Prime}^N\sum_{n|d}\mu(\frac{d}{n})F(d)\\
& = \sum_{n\in Prime}^N\sum_{n|d}\mu(\frac{d}{n})\lfloor\frac{N}{d}\rfloor\lfloor\frac{M}{d}\rfloor\\
& = \sum_{d}^N\sum_{n|d,n\in Prime}\mu(\frac{d}{n})\lfloor\frac{N}{d}\rfloor\lfloor\frac{M}{d}\rfloor\\
& = \sum_{d}^N\lfloor\frac{N}{d}\rfloor\lfloor\frac{M}{d}\rfloor\sum_{n|d, n\in Prime} \mu(\frac{d}{n})
\end{aligned}
\]

通过稍微修改线筛,我们可以与处理出\(\mu\),然后可以预处理出所有的\(\sum_{n|d,n\in Prime}\mu(\frac{d}{n})\)。最后再整除分块统计答案就可以了。

参考程序

程序中,mu即为\(\mu\),\(Sum\)为前缀和。

#include <bits/stdc++.h>
using namespace std; const int MaxN = 10000010;
int Mu[ MaxN ], Vis[ MaxN ];
long long Sum[ MaxN ];
int Num, Prime[ 1000010 ]; void Init() {
Mu[ 1 ] = 1;
for( int i = 2; i <= MaxN; ++i ) {
if( !Vis[ i ] ) Prime[ ++Num ] = i, Mu[ i ] = -1;
for( int j = 1; j <= Num && ( long long ) i * Prime[ j ] <= ( long long ) MaxN; ++j ) {
Vis[ i * Prime[ j ] ] = 1;
if( i % Prime[ j ] == 0 ) break;
Mu[ i * Prime[ j ] ] = - Mu[ i ];
}
}
for( int i = 1; i <= MaxN; ++i )
for( int j = 1; j <= Num && ( long long ) i * Prime[ j ] <= ( long long ) MaxN; ++j )
Sum[ i * Prime[ j ] ] += Mu[ i ];
for( int i = 2; i <= MaxN; ++i ) Sum[ i ] += Sum[ i - 1 ];
return;
} void Work() {
int N, M;
scanf( "%d%d", &N, &M );
if( N > M ) swap( N, M );
long long Ans = 0;
for( int x = 1, y; x <= N; x = y + 1 ) {
y = min( N / ( N / x ), M / ( M / x ) );
Ans += 1LL * ( N / x ) * ( M / x ) * ( Sum[ y ] - Sum[ x - 1 ] );
}
printf( "%lld\n", Ans );
return;
} int main() {
Init();
int T; scanf( "%d", &T );
for( ; T; --T ) Work();
return 0;
}

YY的GCD【luoguP2257】的更多相关文章

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

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

  2. [BZOJ2820]YY的GCD

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

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

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

  4. 【BZOJ】【2820】YY的GCD

    莫比乌斯反演 PoPoQQQ讲义第二题. 暴力枚举每个质数,然后去更新它的倍数即可,那个g[x]看不懂就算了…… 为什么去掉了一个memset就不T了→_→…… /****************** ...

  5. 【莫比乌斯反演】关于Mobius反演与gcd的一些关系与问题简化(bzoj 2301 Problem b&&bzoj 2820 YY的GCD&&BZOJ 3529 数表)

    首先我们来看一道题  BZOJ 2301 Problem b Description 对于给出的n个询问,每次求有多少个数对(x,y),满足a≤x≤b,c≤y≤d,且gcd(x,y) = k,gcd( ...

  6. 【BZOJ 2820】 YY的GCD (莫比乌斯+分块)

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

  7. 【BZOJ2820】YY的GCD(莫比乌斯反演)

    [BZOJ2820]YY的GCD(莫比乌斯反演) 题面 讨厌权限题!!!提供洛谷题面 题解 单次询问\(O(n)\)是做过的一模一样的题目 但是现在很显然不行了, 于是继续推 \[ans=\sum_{ ...

  8. YY的GCD

    YY的GCD 给出T个询问,询问\(\sum_{i=1}^N\sum_{j=1}^M(gcd(i,j)\in prime)\),T = 10000,N, M <= 10000000. 解 显然质 ...

  9. 洛谷【P2257】YY的GCD

    YY的GCD 原题链接 这应该是我做的第一道莫比乌斯反演的题目. 题目描述 神犇YY虐完数论后给傻×kAc出了一题 给定N, M,求1<=x<=N, 1<=y<=M且gcd(x ...

  10. 【BZOJ2820】YY的GCD

    [BZOJ2820]YY的GCD Description 神犇YY虐完数论后给傻×kAc出了一题 给定N, M,求1<=x<=N, 1<=y<=M且gcd(x, y)为质数的( ...

随机推荐

  1. Java多线程(二):Thread类

    Thread类的实例方法 start() start方法内部会调用方法start方法启动一个线程,该线程返回start方法,同时Java虚拟机调用native start0启动另一个线程调用run方法 ...

  2. 《深入实践C++模板编程》之二——模板类

    1.类的模板的使用 类,由于没有参数,所以没有模板实参推导机制. #include <stdexcept> template<typename T> class my_stac ...

  3. 基于C#开发的扩展按钮控件

    最近在准备一套自定义控件开发的课程,下面将第一个做的按钮控件分享给大家. 其实这个控件属于自定义控件中的扩展控件,与组合控件和GDI+开发的控件不同,这个控件是继承原生的Button, 这个控件的目的 ...

  4. MVC4 日期格式化

    // MVC返回到View的日期一般都会带有0分0秒,比如2014/08/22 在前端显示为2014/08/22 00:00:00,比较不美观 // 如果是想展示数据 用label @Html.Lab ...

  5. LeetCode 172:阶乘后的零

    给定一个整数 n, 返回 n! 结果中尾数为零的数量. 示例 : 输入: 输出: 解释: ! = , 尾数中没有零. 示例 : 输入: 输出: 解释: ! = , 尾数中有个零. 说明:算法的时间复杂 ...

  6. 如何使用koa搭建一个简单服务

    1.首先检测是否已经有node环境?   把Windows的黑窗体的命令行工具调用出来   敲击命令行node -v , 然后,就可以看到这个打印出了一个版本号,这就证明我们的node.js已经是安装 ...

  7. Photoshop从入门到精通所有视频教程(43G)以及素材资料免费拿

    包含了Photoshop从入门到精通所有需要了解的视频教程资料,并且包含了大量的P图素材. 资料获取方式,关注公总号RaoRao1994,查看往期精彩-所有文章,即可获取资源下载链接 更多资源获取,请 ...

  8. MySQL授权远程用户登录权限

    1 举例子,建数据库,然后 赋予用户远程访问的所有权限,最后刷新权限 create database cmf DEFAULT CHARACTER SET utf8; grant all on cmf. ...

  9. Java面向对象(三) 【面向对象深入:抽象类,接口,内部类等】

    面向对象(Object Oriented) 1.抽象类抽象就是将拥有共同方法和属性的对象提取出来.提取后,重新设计一个更加通用.更加大众化的类,就叫抽象类.1)abstract 关键字修饰类.方法,即 ...

  10. SQL语句复习【专题六】

    SQL语句复习[专题六] 用户 + 创建表  --创建一个新的用户,然后给新的用户创建一张表,然后给表中添加一些数据.查询表中的数据 --创建用户需要比较大的权限 DBA create user di ...