LuoguP2257 YY的GCD
题目描述
神犇YY虐完数论后给傻×kAc出了一题
给定N, M,求1<=x<=N, 1<=y<=M且gcd(x, y)为质数的(x, y)有多少对
kAc这种傻×必然不会了,于是向你来请教……
多组输入
输入输出格式
输入格式:
第一行一个整数T 表述数据组数
接下来T行,每行两个正整数,表示N, M
输出格式:
T行,每行一个整数表示第i组数据的结果
输入输出样例
输入样例#1:
复制
2
10 10
100 100
输出样例#1:
复制
30
2791
说明
T = 10000
N, M <= 10000000
题解
以下均设\(n<=m\)
\begin{align*}
&\sum_{i=1}^{n}\sum_{j=1}^{m}{[gcd(i,j)=p](p\in prime)}\\
&=\sum_{p\in prime}\sum_{i=1}^{\lfloor \frac{n}{p} \rfloor}\sum_{j=1}^{\lfloor \frac{m}{p} \rfloor}{[gcd(i,j)=1]}\\
&=\sum_{p\in prime}\sum_{i=1}^{\lfloor \frac{n}{p} \rfloor}\sum_{j=1}^{\lfloor \frac{m}{p} \rfloor}\sum_{d|gcd(i,j)}{\mu(d)}\\
&=\sum_{p\in prime}\sum_{d=1}^{\lfloor \frac{n}{p}\rfloor}{\mu(d)\lfloor \frac{n}{dp} \rfloor \lfloor \frac{m}{dp} \rfloor}
\end{align*}
}
\]
这样复杂度是\(O(p\sqrt{n})\)的(p为素数个数),会超时,要继续推
然而我只会推到这里了,数学题真毒瘤.jpg
题解里的大爷都是神仙.jpg
新操作get:在式子化到最简的时候,我们可以考虑一下更换枚举项,把这个式子搞成可以预处理的,然后降低复杂度
设T=dp\\
\begin{align*}
&\sum_{p\in prime}\sum_{d=1}^{\lfloor \frac{n}{p}\rfloor}{\mu(d)\lfloor \frac{n}{dp} \rfloor \lfloor \frac{m}{dp} \rfloor}\\
&=\sum_{p\in prime}\sum_{d=1}^{\lfloor \frac{n}{p}\rfloor}{\mu(d)\lfloor \frac{n}{T} \rfloor \lfloor \frac{m}{T} \rfloor}\\
&=\sum_{T=1}^{n}{\lfloor \frac{n}{T} \rfloor \lfloor \frac{m}{T} \rfloor}\sum_{p|T,p\in prime}{\mu(\frac{T}{p})}
\end{align*}
}
\]
于是预处理后面的那块就好,具体做法是对每个素数p,枚举它的倍数T,加上\(\mu(\frac{T}{p})\)
式子推出来代码就很容易码了qwq
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define N 10000020
int n, m, cnt = 0;
int mu[N], vis[N], p[N];
ll f[N], sum[N];
void init() {
mu[1] = 1;
for(int i = 2; i < N; ++i) {
if(!vis[i]) {p[++cnt] = i; mu[i] = -1;}
for(int j = 1; j <= cnt && p[j] * i < N; ++j) {
vis[p[j] * i] = 1;
if(i % p[j] == 0) break;
mu[i * p[j]] -= mu[i];
}
}
for(int i = 1; i <= cnt; ++i)
for(int j = 1; j * p[i] < N; j ++)
f[j * p[i]] += mu[j];
for(int i = 1; i < N; ++i) sum[i] = sum[i - 1] + f[i];
}
ll calc(int a, int b) {
ll s = 0;
for(int l = 1, r; l <= a; l = r + 1) {
r = min(a / (a / l), b / (b / l));
s += 1ll * (sum[r] - sum[l - 1]) * (a / l) * (b / l);
}
return s;
}
int main() {
#ifndef ONLINE_JUDGE
freopen("1.in","r",stdin);
freopen("1.out","w",stdout);
#endif
init();
int T;
scanf("%d", &T);
while(T--) {
scanf("%d%d", &n, &m);
if(n > m) swap(n, m);
printf("%lld\n", calc(n, m));
}
return 0;
}
LuoguP2257 YY的GCD的更多相关文章
- [题解] LuoguP2257 YY的GCD
传送门 给\(n,m\),让你求 \[ \sum\limits_{i=1}^n \sum\limits_{j=1}^m [\gcd(i,j) \in prime] \] 有\(T\)组询问\((T \ ...
- 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. 解 显然质 ...
随机推荐
- pyinstaller将python脚本生成exe
一.下载pyinstaller 二.生成exe 下载pyinstaller 1.在C:\python27\Scripts目录下打开cmd界面,执行命令:pip install PyInstaller ...
- while练习题
# 1. 使用while循环输出1 2 3 4 5 6 8 9 10count = 1while count <= 10: if count == 7: count += 1 continue ...
- poj1741 树上的分治
题意是说给了n个点的树n<=10000,问有多少个点对例如(a,b)他们的之间的距离小于等于k 采用树的分治做 #include <iostream> #include <cs ...
- hdu3511 圆的扫描线
http://blog.csdn.net/firenet1/article/details/47041145 #include <iostream> #include <algori ...
- arc 092C 2D Plane 2N Points
题意: 有n个红色的点和n个蓝色的点,如果红色的点的横坐标和纵坐标分别比蓝色的点的横坐标和纵坐标小,那么这两个点就可以成为一对友好的点. 问最多可以形成多少对友好的点. 思路: 裸的二分图匹配,对于满 ...
- Hive中如何快速的复制一张分区表(包括数据)
Hive中有时候会遇到复制表的需求,复制表指的是复制表结构和数据. 如果是针对非分区表,那很简单,可以使用CREATE TABLE new_table AS SELECT * FROM old_tab ...
- max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
elasticsearch启动时遇到的错误 问题翻译过来就是:elasticsearch用户拥有的内存权限太小,至少需要262144: 解决: 切换到root用户 执行命令: sysctl -w vm ...
- [转载]ASP.NET页面之间传递值的几种方式
页面传值是学习asp.net初期都会面临的一个问题,总的来说有页面传值.存储对象传值.ajax.类.model.表单等.但是一般来说,常用的较简单有QueryString,Session,Cookie ...
- <转>jmeter(八)断言
本博客转载自:http://www.cnblogs.com/imyalost/category/846346.html 个人感觉不错,对jmeter讲解非常详细,担心以后找不到了,所以转发出来,留着慢 ...
- java初学者必看的学习路线
不管在编程语言的排行榜中,还是在大多数企业应用的广泛程度来看,Java一直都是当之无愧的榜首.Java语言有着独特的魅力吸引着广大的年轻人去学习,每个人学习的方式方法不一样. 第一步:首先要做好学习前 ...