YY的GCD【luoguP2257】
题目大意
有至多\(10000\)组询问,问\(1 < i \leqslant N \leqslant 10000000, 1 < j \leqslant M \leqslant 10000000\),并且\(gcd(i, j)\)为质数的有多少对。
解题思路
为了方便描述,我们定义\([]\),当\([]\)中表达式为真时为\(1\),否则为\(0\)。同时定义\(Prime\)为素数集合。
下面的讨论中,我们不妨设\(N \leqslant M\)。
我们设
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)\)表述出来。
由莫比乌斯反演,得
\]
其中\(\mu\)是莫比乌斯函数。
那么答案就可以表示为
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】的更多相关文章
- BZOJ 2820: YY的GCD [莫比乌斯反演]【学习笔记】
2820: YY的GCD Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 1624 Solved: 853[Submit][Status][Discu ...
- [BZOJ2820]YY的GCD
[BZOJ2820]YY的GCD 试题描述 神犇YY虐完数论后给傻×kAc出了一题给定N, M,求1<=x<=N, 1<=y<=M且gcd(x, y)为质数的(x, y)有多少 ...
- bzoj 2820 YY的GCD 莫比乌斯反演
题目大意: 给定N, M,求1<=x<=N, 1<=y<=M且gcd(x, y)为质数的(x, y)有多少对 这里就抄一下别人的推断过程了 后面这个g(x) 算的方法就是在线性 ...
- 【BZOJ】【2820】YY的GCD
莫比乌斯反演 PoPoQQQ讲义第二题. 暴力枚举每个质数,然后去更新它的倍数即可,那个g[x]看不懂就算了…… 为什么去掉了一个memset就不T了→_→…… /****************** ...
- 【莫比乌斯反演】关于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( ...
- 【BZOJ 2820】 YY的GCD (莫比乌斯+分块)
YY的GCD Description 神犇YY虐完数论后给傻×kAc出了一题 给定N, M,求1<=x<=N, 1<=y<=M且gcd(x, y)为质数的(x, y)有多少 ...
- 【BZOJ2820】YY的GCD(莫比乌斯反演)
[BZOJ2820]YY的GCD(莫比乌斯反演) 题面 讨厌权限题!!!提供洛谷题面 题解 单次询问\(O(n)\)是做过的一模一样的题目 但是现在很显然不行了, 于是继续推 \[ans=\sum_{ ...
- YY的GCD
YY的GCD 给出T个询问,询问\(\sum_{i=1}^N\sum_{j=1}^M(gcd(i,j)\in prime)\),T = 10000,N, M <= 10000000. 解 显然质 ...
- 洛谷【P2257】YY的GCD
YY的GCD 原题链接 这应该是我做的第一道莫比乌斯反演的题目. 题目描述 神犇YY虐完数论后给傻×kAc出了一题 给定N, M,求1<=x<=N, 1<=y<=M且gcd(x ...
- 【BZOJ2820】YY的GCD
[BZOJ2820]YY的GCD Description 神犇YY虐完数论后给傻×kAc出了一题 给定N, M,求1<=x<=N, 1<=y<=M且gcd(x, y)为质数的( ...
随机推荐
- Cannot call sendRedirect() after the response has been committed的解决办法
做一个Login Demo的时候,写了如下代码: protected void doPost(HttpServletRequest request, HttpServletResponse respo ...
- asp.net 8 Request,Response,Server
Request成员: 1.Request.UrlReferrer 获取请求的来源,可以防盗链 Response.Write(Request.Url.ToString());//获取当前请求的URL地址 ...
- WPF 键盘事件
private void Window_KeyDown(object sender, KeyEventArgs e) { if (e.KeyStates==Keyboard.GetKeyStates( ...
- 【原创】大数据基础之ETL vs ELT or DataWarehouse vs DataLake
ETL ETL is an abbreviation of Extract, Transform and Load. In this process, an ETL tool extracts the ...
- linux 阿里云 新机器 安装jdk1.8
2019年7月17日15:58:34 按着顺序来: wget https://download.oracle.com/otn-pub/java/jdk/8u131-b11/d54c1d3a095b4f ...
- [转载]from __future__ import的用法
一句话概况:这是为了在低版本python中使用高版本特性而引入的,最常用的就是print_function来实现在2.x中使用3.x中的print()命令,从而避免在切换版本时修改代码. https: ...
- Shell脚本grep命令
三剑客:grep sed awk grep:文本行过滤工具 sed: 文本行编辑器(流编辑器) awk: 报告生成器,输出格式化 grep包含三个命令: grep egrep fgrep .他们 ...
- phpstudycomposer thinkPHP5.1 使用
1.首先把php变成全局变量 2.打开phpstudy composer 的安装目录 E:\phpstudy\PHPTutorial\tools\composer 把里面的文件全部删除(或者备份一下) ...
- web开发中的支付宝支付和微信支付
https://www.jianshu.com/p/155757d2b9eb <!-- wxPay --SDK--> <script src="https://res.wx ...
- java8学习之深入函数式接口与方法引用
函数式接口: 函数式接口[FunctionalInterface]是整个Lambda表达式的一个根源,换句话来说java8中的Lambda表达式要想彻底掌握,前提是要彻底理解好函数式接口,所以这次继续 ...