洛谷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] ...
随机推荐
- Flexbox 布局的最简单表单 (转)
作者: 阮一峰 弹性布局(Flexbox)逐渐流行,越来越多人使用,因为它写 CSS 布局真是太方便了. 三年前,我写过 Flexbox 的介绍(上,下),但是有些地方写得不清楚.今天,我看到一篇教程 ...
- html5手机web app <input type="file" > 只调用图库,禁止调用摄像头?
<input type="file" accept="image/*"><input type="file" accept ...
- python javar send
# -*- coding: utf-8 -*-import jpypeimport os.pathjarpath = os.path.join(os.path.abspath('.'), 'axja' ...
- JavaScript创建对象(三)——原型模式
在JavaScript创建对象(二)——构造函数模式中提到,构造函数模式存在相同功能的函数定义多次的问题.本篇文章就来讨论一下该问题的解决方案——原型模式. 首先我们来看下什么是原型.我们在创建一个函 ...
- UVa 10891 - Game of Sum 动态规划,博弈 难度: 0
题目 https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&a ...
- WPF 基于Adorner实现类似Popup效果
1. 什么是Adorner 装饰器是一种特殊类型的FrameworkElement,可用来向用户提供可视提示. 装饰器有很多用途,可用来向元素添加功能句柄,或者提供有关某个控件的状态信息. 2. ...
- RabbitMQ 设置消息的优先级
在RabbitMQ中,可以设置消息的优先级,也就相当于在队列中置顶某条消息,让某个消息优先得到处理的功能. 既然是设置消息的优先级,那么就是针对生产者,也就是消息发布端. 设置消息的优先级一共有2个步 ...
- Java 中的代理模式及动态代理
原文:https://blog.csdn.net/briblue/article/details/73928350
- Xilinx SDK编译Microblaze时出错
reference:http://www.eeboard.com/evaluation/digilent-cmod-a7-fpga/9/ 在vivado 2015.4中创建microblaze软核,l ...
- Java基础-语法定义
Java三个体系 Java SE(Java Platform,Standard Edition).Java SE 以前称为 J2SE.它允许开发和部署在桌面.服务器.嵌入式环境和实时环境中使用的 Ja ...