洛谷P2568 GCD(线性筛法)
题目链接:传送门
题目:
题目描述 给定整数N,求1<=x,y<=N且Gcd(x,y)为素数的数对(x,y)有多少对.
输入输出格式
输入格式: 一个整数N 输出格式: 答案 输入输出样例
输入样例#: 复制 输出样例#: 复制 说明 对于样例(,),(,),(,),(,) <=N<=^ 来源:bzoj2818 本题数据为洛谷自造数据,使用CYaRon耗时5分钟完成数据制作。
看了好几天数论了,忍不住出来切切水题。
思路:
若已知x,y,因为gcd(x, y)为素数,令p = gcd(x, y),a = x/p,b = y/p,则gcd(a, b) = 1;
所以对于给定的素数p,只要a,b满足gcd(a, b) = 1,则对应的x = a*p,y = b*p就是满足题意的一个数对。因为gcd(a, b) = 1,考虑欧拉函数。
不妨令a ≤ b,则对于一个确定的b,a的选择数有φ(b)种,那么所有a,b的选择就有$\sum \phi (b)$种,b*p ≤ N,所以b的上界为N/p。a,b可以互换位置所以要×2,a,b相等时(a = b = 1)只能算一种所以要-1,所以答案为$\sum_{prime\leqslant N}\left ( 2*\sum_{j=1}^{N/prime}\phi (j)-1 \right )$。
线性筛出质数和欧拉函数O(N),枚举所有小于N的素数就可以了O(N/logN)。
总复杂度O(N+N/logN)。
注意:1e7的数组开多了会MLE,而最小的质数为2,所以欧拉函数和前缀和可以只开到N/2的大小。
#include <bits/stdc++.h> using namespace std;
typedef long long ll;
const int MAX_N = 1e7 + ; int N;
int prime[MAX_N+];
int phi[MAX_N/+];
ll sum[MAX_N/+]; void getPrime_and_Phi() {
memset(prime, , sizeof prime);
phi[] = ;
for (int i = ; i <= MAX_N; i++) {
if (!prime[i]) prime[++prime[]] = i, phi[i] = i-;
for (int j = ; j <= prime[] && prime[j] <= MAX_N/i; j++) {
prime[prime[j]*i] = ;
if (prime[j]*i <= MAX_N/)
phi[prime[j]*i] = phi[i] * (i%prime[j] ? prime[j]- : prime[j]);
if (i % prime[j] == ) break;
}
}
} void init() {
getPrime_and_Phi();
sum[] = ;
for (int i = ; i <= MAX_N/; i++) {
sum[i] = sum[i-] + phi[i];
}
} int main()
{
init();
cin >> N;
ll ans = ;
for (int i = ; i <= prime[] && prime[i] <= N; i++) {
ans += sum[N/prime[i]]*-;
}
cout << ans << endl;
return ;
}
洛谷P2568 GCD(线性筛法)的更多相关文章
- 洛谷P2568 GCD (欧拉函数/莫比乌斯反演)
P2568 GCD 题目描述 给定整数N,求1<=x,y<=N且Gcd(x,y)为素数的数对(x,y)有多少对. 输入输出格式 输入格式: 一个整数N 输出格式: 答案 输入输出样例 输入 ...
- [洛谷P2568]GCD
题目大意:给你$n(1\leqslant n\leqslant 10^7)$,求$\displaystyle\sum\limits_{x=1}^n\displaystyle\sum\limits_{y ...
- 洛谷 P2568 GCD
https://www.luogu.org/problemnew/show/P2568#sub 最喜欢题面简洁的题目了. 本题为求两个数的gcd是素数,那么我们将x和y拆一下, 假设p为$gcd(x, ...
- 洛谷 - P2568 - GCD - 欧拉函数
https://www.luogu.org/problemnew/show/P2568 统计n以内gcd为质数的数的个数. 求 \(\sum\limits_p \sum\limits_{i=1}^{n ...
- 洛谷 P2568 GCD 题解
原题链接 庆祝一下:数论紫题达成成就! 第一道数论紫题.写个题解庆祝一下吧. 简要题意:求 \[\sum_{i=1}^n \sum_{j=1}^n [gcd(i,j)==p] \] 其中 \(p\) ...
- 洛谷 P2568 GCD(莫比乌斯反演)
题意:$\sum_{i=1}^{n}\sum_{j=1}^{n}[gcd(i,j)\epsilon prime]$. 对于这类题一般就是枚举gcd,可得: =$\sum_{d\epsilon prim ...
- 洛谷P2568 GCD(莫比乌斯反演)
传送门 这题和p2257一样……不过是n和m相同而已…… 所以虽然正解是欧拉函数然而直接改改就行了所以懒得再码一遍了2333 不过这题卡空间,记得mu开short,vis开bool //minamot ...
- 洛谷P2398 GCD SUM (数学)
洛谷P2398 GCD SUM 题目描述 for i=1 to n for j=1 to n sum+=gcd(i,j) 给出n求sum. gcd(x,y)表示x,y的最大公约数. 输入输出格式 输入 ...
- 洛谷 P1890 gcd区间
P1890 gcd区间 题目提供者 洛谷OnlineJudge 标签 数论(数学相关) 难度 普及/提高- 题目描述 给定一行n个正整数a[1]..a[n]. m次询问,每次询问给定一个区间[L,R] ...
随机推荐
- asp.net mvc 笔记一
webapi controller 中 action 名称 不能与 View controller 中的 action 名称相同,否则 Url.Action("actionName&quo ...
- SQL 常用判断语句
我们在做sql更新时,为防止sql重复执行报错,需要对所需要执行的对象进行判断是否存在: 常用判断脚本如下: 判断视图是否存在 IF object_id('viewname') IS not NULL ...
- img2html实现将图片转换成网页
简单介绍img2html的用法,安装就不用说了pip.这个包现只支持python2,支持python的话需改下源码这几个部分: 加注释的是修改的地方 #!/usr/bin/env python # e ...
- 修改Host,配置域名访问
修改Host,配置域名访问 虽然我们已经能够通过localhost访问本地网站了,为了提高逼格,我们可以修改host文件,设置一个自己喜欢的域名指向本地网站,岂不是更高大上. 明确需求 通过配置, ...
- IDE 版本
BDS 5 2007 D11 VER180 and VER185 RAD Studio 8 XE D15 VER 220 RAD 18 XE 10.1 Berlin D24 VER310 St ...
- 将excel数据分块多线程导入
参考链接:http://blog.csdn.net/liqi_q/article/details/53032027
- Java 面向对象的三大特性之一 继承
继承: Java是继承的三大特性之一,是Java中实现代码重用的手段之一 将重复的代码抽取到父类中继承的有点或者现实 优点: 方便修改代码 减少代码量 Java中继承的语法: 修饰符 SubClass ...
- ubuntu 命令行卸载并清理软件
1.删除软件 方法一.如果你知道要删除软件的具体名称,可以使用 sudo apt-get remove --purge 软件名称 sudo apt-get autoremove --purge 软件名 ...
- 升级pip10.0.0后出现ModuleNotFoundError: No module named 'pip'的问题
pip10升级后各种pip install出错----- Traceback (most recent call last): File "/usr/local/bin/pip", ...
- Cracking The Coding Interview 2.0 单链表
#include <iostream> #include <string> using namespace std; class linklist { private: cla ...