【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\) 就行 ...
随机推荐
- Codeforces - Educational Codeforces Round 5 - E. Sum of Remainder
题目链接:http://codeforces.com/contest/616/problem/E 题目大意:给定整数n,m(1≤n,m≤1013), 求(n mod 1 + n mod 2 + ... ...
- Selenium入门16 获取页面源代码
页面源代码:page_source属性 获取源代码之后,再用正则表达式匹配出所有的链接,代码如下: #coding:utf-8 from selenium import webdriver impor ...
- vuejs作用域插槽
作用域插槽 <div id='root'> <child> <template slot-scope='props'> <h1>{{props.item ...
- Android Realm初试
Realm is a mobile database that runs directly inside phones, tablets or wearables. This repository h ...
- SpringBoot学习12:springboot异常处理方式2(使用@ExceptionHandle注解)
1.编写controller package com.bjsxt.controller; import org.springframework.stereotype.Controller; impor ...
- 判断一个Object是否为数组Array的方法
1.constructor constructor 属性是每个有原型对象的原型成员 arr.constructor == Array //true说明arr是数组 2.isArray arr.isA ...
- 1801: [Ahoi2009]chess 中国象棋
Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 2520 Solved: 1524[Submit][Status][Discuss] Descripti ...
- spring-bean(xml方式DI)
三种属性注入方式 构造函数注入 1.在Bean实体中写入构造函数(带参构造) 2. <bean id=”该bean的名称” class=”注入的bean的全路径”> <constru ...
- MySQL 5.7传统复制到GTID在线切换(一主一从)
Preface Classic replication is commonly used in previous version of MySQL.It's really tough in ...
- 虚拟机VMware安装Kali Linux
本文讲解如何在虚拟机上安装Kali Linux,希望对大家有所帮助. 准备:一台电脑,VMware(VMware安装教程) 一.下载系统镜像文件 1.首先下载系统镜像,进入kali官网,在Downlo ...