AT_abc215_d 题解
本篇题解为此题较简单做法及较少码量,并且码风优良,请放心阅读。
题目简述
给定 \(N\),\(M\) 及含有 \(N\) 个整数的序列 \(A\)。
求 \(1 \sim M\) 中与所有 \(a_i\) 均互质的整数及个数。
思路
首先说一下最开始的想法。
直接暴力枚举 \(1 \sim M\) 的数,再分别枚举每个数与 \(a_i\) 是否互质,时间复杂度 \(O(N \times M)\) 左右,一看数据范围直接爆炸,提交结果就可想而知了。
TLE \(0\) 分代码如下,因为是暴力就不写注释了:
#include<iostream>
#include<cmath>
using namespace std;
int n, m, a[100005], num[100005], ans = 0;
int gcd(int x, int y) {
return (y == 0 ? x : gcd(y, x % y));
}
int main() {
cin >> n >> m;
for(int i = 1; i <= n; i ++) cin >> a[i];
for(int i = 1; i <= m; i ++) {
bool flag = false;
for(int j = 1; j <= n; j ++)
if(gcd(a[j], i) != 1) { flag = true; break; }
if(!flag) ans ++, num[ans] = i;
}
cout << ans << endl;
for(int i = 1; i <= ans; i ++) cout << num[i] << endl;
return 0;
}
接下来让我们进行一点小优化。
既然对于 \(1 \sim M\) 每个数进行暴力枚举会超时,那么就需要在输入时进行一些标记,经过一些尝试后发现,可以在输入时记录每个数的因数并标记在 \(flag\) 数组中,看到 \(a_i\) 的数据范围后发现可以用桶存。因为 \(a_i\) 的因数会重复,所以在输入后需要另开一个 \(vul\) 存储序列 \(A\) 的所有因数,不必用桶存。
如:
#define MAXN 1000000
void f(int x) {
flag[x] = true;
for(int i = 2; i * i <= x; i ++)
if(x % i == 0) flag[i] = flag[x / i] = true;
return;
}
int main() {
cin >> n >> m;
for(int i = 1; i <= n; i ++) { cin >> x; f(x); }
for(int i = 2; i <= MAXN; i ++)
if(flag[i]) vul[++ t] = i;
return 0;
}
接着就可以不那么暴力的枚举了。
首先枚举 \(1 \sim M\) 是一定的,但在第二层循环中仅需枚举当前 \(i\) 是否为 \(vul\) 中因数的倍数,如果是直接跳出当前循环,如果跑了一遍 \(vul\) 发现当前 \(i\) 不是任何 \(vul\) 中因数的倍数,则记录答案至数组 \(num\) 中即可。
经过以上一点小优化,很容易即可写出代码:
#include<iostream>
#include<cmath>
using namespace std;
#define MAXN 1000000 // 最大值
int n, m, x, t, vul[MAXN + 5], num[MAXN + 5], ans, j;
bool flag[MAXN + 5];
void f(int x) {
flag[x] = true;
for(int i = 2; i * i <= x; i ++) // 遍历 x 求因数
if(x % i == 0) flag[i] = flag[x / i] = true; // 标记 x 的因数
return;
}
int main() {
cin >> n >> m;
for(int i = 1; i <= n; i ++) { cin >> x; f(x); } // 输入中处理
for(int i = 2; i <= MAXN; i ++)
if(flag[i]) vul[++ t] = i;
for(int i = 1; i <= m; i ++) {
for(j = 1; j <= t; j ++)
if(i % vul[j] == 0) break; // 不满足情况直接跳出循环
if(j == t + 1) num[++ ans] = i; // 满足情况记录答案
}
cout << ans << endl; // 输出个数
for(int i = 1; i <= ans; i ++) cout << num[i] << endl; // 输出答案
return 0;
}
\]
AT_abc215_d 题解的更多相关文章
- 2016 华南师大ACM校赛 SCNUCPC 非官方题解
我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...
- noip2016十连测题解
以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...
- BZOJ-2561-最小生成树 题解(最小割)
2561: 最小生成树(题解) Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1628 Solved: 786 传送门:http://www.lyd ...
- Codeforces Round #353 (Div. 2) ABCDE 题解 python
Problems # Name A Infinite Sequence standard input/output 1 s, 256 MB x3509 B Restoring P ...
- 哈尔滨理工大学ACM全国邀请赛(网络同步赛)题解
题目链接 提交连接:http://acm-software.hrbust.edu.cn/problemset.php?page=5 1470-1482 只做出来四道比较水的题目,还需要加强中等题的训练 ...
- 2016ACM青岛区域赛题解
A.Relic Discovery_hdu5982 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Jav ...
- poj1399 hoj1037 Direct Visibility 题解 (宽搜)
http://poj.org/problem?id=1399 http://acm.hit.edu.cn/hoj/problem/view?id=1037 题意: 在一个最多200*200的minec ...
- 网络流n题 题解
学会了网络流,就经常闲的没事儿刷网络流--于是乎来一发题解. 1. COGS2093 花园的守护之神 题意:给定一个带权无向图,问至少删除多少条边才能使得s-t最短路的长度变长. 用Dijkstra或 ...
- CF100965C题解..
求方程 \[ \begin{array}\\ \sum_{i=1}^n x_i & \equiv & a_1 \pmod{p} \\ \sum_{i=1}^n x_i^2 & ...
- JSOI2016R3 瞎BB题解
题意请看absi大爷的blog http://absi2011.is-programmer.com/posts/200920.html http://absi2011.is-programmer.co ...
随机推荐
- dpkg和rpm对比及常用命令
dpkg(Debian Package)和rpm(RPM Package Manager)是两种不同的Linux包管理工具,它们各自在特定的Linux发行版中占据核心地位.两者之间对比如下: 所属发行 ...
- 如何从0-1了解 熟悉 精通gitlab
加入gitlab团队项目: 打开其他用户极狐邀请邮件: 点击接受紫色邀请按钮"accept invitation": 选择免费试用90天saas服务: 使用邮箱注册进行邮箱验证[验 ...
- Django - 在后台上传文章封面图 - 并在前端页面展示
需要用到 models.ImageField(), 它继承自 models.FileField(), 用ImageField的时候需要安装pillow pip install pillow -i h ...
- Vue cli之单文件组件
组件有两种:脚本化组件.单文件组件 脚本化组件的缺点: html代码是作为js的字符串进行编写,所以组装和开发的时候不易理解,而且没有高亮效果. 脚本化组件用在小项目中非常合适,但是复杂的大项目中,如 ...
- 【阿里天池云-龙珠计划】薄书的机器学习笔记——快来一起挖掘幸福感!Task04
[给各位看官请安] 大家一起来集齐七龙珠召唤神龙吧!!! 学习地址:AI训练营机器学习-阿里云天池 推荐一下我由此上车的公众号:AI蜗牛车,时空序列相关文章挺多的. Task01:基于逻辑回归模型的多 ...
- docker离线安装
1. yum安装 #源添加 wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo ...
- 8.15考试总结(NOIP模拟40)[送花·星空·零一串]
我只对现实世界绝望过,却未对自己绝望过! T1 送花 解题思路 线段树维护序列. 我们暴力枚举右端点,用线段树搞出当前右端点的最优的左端点的值. 假设当前扫到的右端点是 r ,颜色是 col. 这种颜 ...
- 7.20考试总结(NOIP模拟21)[Median·Game·Park]
雨滴降落的速度是每秒十米,我该用怎么样的速度,才能将你挽留? 前言 关于语文素养如何限制OI水平2,正好现在文化课巨佬们正在考语文(那我走???) T1 我以为整数是不用输出 .0 的,然后喜挂 30 ...
- 【Effective C++】设计与声明——成员变量和成员函数
将成员变量声明为private 为什么成员变量不该是public? (1)从语法一致性来说,如果成员变量不是public,就需要通过成员函数访问成员变量.public接口内的每样东西都是函数的话,客户 ...
- TestMarkdown1
VSCode 实时预览还需要执行 Markdown: Open Preview to the Side 命令来实现. 在命令窗口输入 Markdown: Open Preview to the Sid ...