【Luogu P2257】YY 的 GCD
题目
求:
\]
有 \(T\) 组数据, \(T\le 10^4, n, m\le 10^7\)
分析
莫比乌斯反演:
& \sum_{i = 1}^n \sum_{j = 1}^m [\gcd(i, j) \in \mathbb P]\\
= & \sum_{p \in \mathbb P, p\le \min(n, m)}\sum_{i = 1}^n \sum_{j = 1}^m [\gcd(i, j) = p]\\
\end{align*}
\]
设 \(f(x) = \sum_{i = 1}^n \sum_{j = 1}^m [\gcd(i, j) = x]\), $F(x) = \sum_{i = 1}^n \sum_{j = 1}^m [x\ |\gcd(i, j)]=\left\lfloor \frac nx\right\rfloor\left\lfloor \frac mx\right\rfloor $
则有:
\]
故有:
& \sum_{p \in \mathbb P, p\le \min(n, m)}\sum_{i = 1}^n \sum_{j = 1}^m [\gcd(i, j) = p]\\
= & \sum_{p \in \mathbb P, p\le \min(n, m)} f(p) \\
= & \sum_{p \in \mathbb P, p\le \min(n, m)} \sum_{p|d,d\le \min(n, m)} \mu(\frac dp) \left\lfloor \frac nd\right\rfloor\left\lfloor \frac md\right\rfloor \\
= & \sum_{d = 1}^{\min(n, m)} \sum_{p \in \mathbb P,p|d, p\le \min(n, m)} \mu(\frac dp) \left\lfloor \frac nd\right\rfloor\left\lfloor \frac md\right\rfloor \\
= & \sum_{d = 1}^{\min(n, m)} \left\lfloor \frac nd\right\rfloor\left\lfloor \frac md\right\rfloor \sum_{p \in \mathbb P,p|d, p\le \min(n, m)} \mu(\frac dp)
\end{align*}
\]
设 $g(x) = \sum_{p \in \mathbb P,p|x, p\le \min(n, m)} \mu(\frac xp) $
求法(暴力出奇迹, 经测试下面算法耗时不到 \(0.5 s\)):
void get_g(int n) {
for(int i = 1; i <= n; i++) {
int tmp = i;
while(tmp != 1) {
g[i] += mobius[i / s_factor[tmp]];
int p = s_factor[tmp];
if(tmp % (p * p) == 0) break;
for(; tmp % p == 0; tmp /= p);
}
g_prefix[i] = g_prefix[i - 1] + g[i];
}
}
有上式等于:
\]
对于 \(\left\lfloor \frac nd\right\rfloor\left\lfloor \frac md\right\rfloor\) 相同的值整除分块即可.
代码
#include <bits/stdc++.h>
typedef long long Int64;
const int kMaxSize = 1e7 + 5;
int s_factor[kMaxSize], prime[kMaxSize], mobius[kMaxSize], g[kMaxSize],
g_prefix[kMaxSize], prime_tot = 0;
bool isn_prime[kMaxSize];
void euler_sieve(int n) {
mobius[1] = 1;
isn_prime[0] = isn_prime[1] = true;
for(int i = 2; i <= n; i++) {
if(!isn_prime[i]) {
prime[prime_tot++] = i;
s_factor[i] = i;
mobius[i] = -1;
}
for(int j = 0; j < prime_tot && i * prime[j] <= n; j++) {
isn_prime[i * prime[j]] = true;
s_factor[i * prime[j]] = prime[j];
mobius[i * prime[j]] = -mobius[i];
if(i % prime[j] == 0) {
mobius[i * prime[j]] = 0;
break;
}
}
}
}
void get_g(int n) {
for(int i = 1; i <= n; i++) {
int tmp = i;
while(tmp != 1) {
g[i] += mobius[i / s_factor[tmp]];
int p = s_factor[tmp];
if(tmp % (p * p) == 0) break;
for(; tmp % p == 0; tmp /= p);
}
g_prefix[i] = g_prefix[i - 1] + g[i];
}
}
int main() {
euler_sieve(1e7);
get_g(1e7);
int t;
scanf("%d", &t);
while(t--) {
int n, m;
Int64 ans = 0;
scanf("%d%d", &n, &m);
if(!n) break;
for(int l = 1, r; l <= n && l <= m; l = r + 1) {
r = std::min(n / (n / l), m / (m / l));
ans += (Int64)(n / l) * (m / l) * (g_prefix[r] - g_prefix[l - 1]);
}
printf("%lld\n", ans);
}
return 0;
}
【Luogu P2257】YY 的 GCD的更多相关文章
- [Luogu P2257] YY的GCD (莫比乌斯函数)
题面 传送门:洛咕 Solution 推到自闭,我好菜啊 显然,这题让我们求: \(\large \sum_{i=1}^{n}\sum_{j=1}^{m}[gcd(i,j)\in prime]\) 根 ...
- Luogu P2257 YY的GCD
莫比乌斯反演第一题.莫比乌斯反演入门 数论题不多BB,直接推导吧. 首先,发现题目所求\(ans=\sum_{i=1}^n\sum_{j=1}^m [\gcd(i,j)=prime]\) 考虑反演,我 ...
- 【题解】Luogu P2257 YY的GCD
原题传送门 这题需要运用莫比乌斯反演(懵逼钨丝繁衍) 显然题目的答案就是\[ Ans=\sum_{i=1}^N\sum_{j=1}^M[gcd(i,j)=prime]\] 我们先设设F(n)表示满足\ ...
- Luogu P2257 YY的GCD 莫比乌斯反演
第一道莫比乌斯反演...$qwq$ 设$f(d)=\sum_{i=1}^n\sum_{j=1}^m[gcd(i,j)==d]$ $F(n)=\sum_{n|d}f(d)=\lfloor \frac{N ...
- 洛谷 P2257 YY的GCD
洛谷 P2257 YY的GCD \(solution:\) 这道题完全跟[POI2007]ZAP-Queries (莫比乌斯反演+整除分块) 用的一个套路. 我们可以列出答案就是要我们求: \(ans ...
- P2257 YY的GCD
P2257 YY的GCD 题目描述 神犇YY虐完数论后给傻×kAc出了一题 给定N, M,求1<=x<=N, 1<=y<=M且gcd(x, y)为质数的(x, y)有多少对 k ...
- 题解 P2257 YY的GCD
P2257 YY的GCD 解题思路 果然数论的题是真心不好搞. 第一个莫比乌斯反演的题,好好推一下式子吧..(借鉴了blog) 我们要求的答案就是\(Ans=\sum\limits_{i=1}^{n} ...
- P2257 YY的GCD (莫比乌斯反演)
[题目链接] https://www.luogu.org/problemnew/show/P2257 // luogu-judger-enable-o2 /* -------------------- ...
- 洛谷 - P2257 - YY的GCD - 莫比乌斯反演 - 整除分块
https://www.luogu.org/problemnew/show/P2257 求 \(n,m\) 中 \(gcd(i,j)==p\) 的数对的个数 求 $\sum\limits_p \sum ...
- 洛谷 P2257 YY的GCD 题解
原题链接 庆祝: 数论紫题 \(T4\) 达成! 莫比乌斯 \(T1\) 达成! yy 真是个 神犇 前记 之前我觉得: 推式子,直接欧拉筛,筛出个 \(\phi\),然后乱推 \(\gcd\) 就行 ...
随机推荐
- 10大炫酷的HTML5文字动画特效欣赏
文字是网页中最基本的元素,在CSS2.0时代,我们只能在网页上展示静态的文字,只能改变他的大小和颜色,显得枯燥无味.随着HTML5的发展,现在网页中的文字样式变得越来越丰富了,甚至出现了文字动画,HT ...
- BSP和JSP里的UI元素ID生成逻辑
CRM WebClient UI WebClient UI渲染出来的DOM元素的这些C#_W#格式的id是在哪行ABAP代码被生成出来的? 参考我的博客WebClient UI element ID ...
- [转载]互联网 免费的WebService接口
股票行情数据 WEB 服务(支持香港.深圳.上海基金.债券和股票:支持多股票同时查询) Endpoint: http://webservice.webxml.com.cn/WebServices/St ...
- IOS 单例模式(非ARC)
singleton_h :连接字符串和参数 // ## : 连接字符串和参数 #define singleton_h(name) + (instancetype)shared##name; #defi ...
- JS二维数组的写法以及注意事项
最终数组:"line":[ { "Name":"WK_CT", "Sex":"CT", " ...
- EK算法应用,构图(POJ1149)
题目链接:http://poj.org/problem?id=1149 题意中有一点要注意,否则构图就会有问题,每个顾客走后,被打开过的那些猪圈中的猪都可以被任意的调换到其他开着的猪圈中. 这里的构图 ...
- git常用命令(三)
====================================================================== 本地仓库操作 ====================== ...
- Velocity中加载vm文件的三种方式
Velocity中加载vm文件的三种方式: a. 加载classpath目录下的vm文件 /** * 初始化Velocity引擎 * --VelocityEngine是单例模式,线程安全 * @th ...
- java乱码问题
我们知道JSP页面是需要转换为servlet的,在转换过程中肯定是要进行编码的.在JSP转换为servlet过程中下面一段代码起到至关重要的作用. <%@ page language=" ...
- (排班表二)后台动态绘制Grid表格
后台动态绘制值班表(Grid表格 列名不固定) 要求:表头除了值班人姓名,还要显示日期,及每天的星期值,用斜杠‘/’分隔.即:几号/星期几 最终实现的效果:根据查询的年月显示每个值班人查询月份每天的值 ...