洛谷链接&Atcoder 链接

本篇题解为此题较简单做法较少码量,并且码风优良,请放心阅读。

题目简述

给定 \(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;
}

提交记录

\[\text{The End!!!}
\]

AT_abc215_d 题解的更多相关文章

  1. 2016 华南师大ACM校赛 SCNUCPC 非官方题解

    我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...

  2. noip2016十连测题解

    以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...

  3. BZOJ-2561-最小生成树 题解(最小割)

    2561: 最小生成树(题解) Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1628  Solved: 786 传送门:http://www.lyd ...

  4. Codeforces Round #353 (Div. 2) ABCDE 题解 python

    Problems     # Name     A Infinite Sequence standard input/output 1 s, 256 MB    x3509 B Restoring P ...

  5. 哈尔滨理工大学ACM全国邀请赛(网络同步赛)题解

    题目链接 提交连接:http://acm-software.hrbust.edu.cn/problemset.php?page=5 1470-1482 只做出来四道比较水的题目,还需要加强中等题的训练 ...

  6. 2016ACM青岛区域赛题解

    A.Relic Discovery_hdu5982 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Jav ...

  7. poj1399 hoj1037 Direct Visibility 题解 (宽搜)

    http://poj.org/problem?id=1399 http://acm.hit.edu.cn/hoj/problem/view?id=1037 题意: 在一个最多200*200的minec ...

  8. 网络流n题 题解

    学会了网络流,就经常闲的没事儿刷网络流--于是乎来一发题解. 1. COGS2093 花园的守护之神 题意:给定一个带权无向图,问至少删除多少条边才能使得s-t最短路的长度变长. 用Dijkstra或 ...

  9. CF100965C题解..

    求方程 \[ \begin{array}\\ \sum_{i=1}^n x_i & \equiv & a_1 \pmod{p} \\ \sum_{i=1}^n x_i^2 & ...

  10. JSOI2016R3 瞎BB题解

    题意请看absi大爷的blog http://absi2011.is-programmer.com/posts/200920.html http://absi2011.is-programmer.co ...

随机推荐

  1. 环境声音分类的深度 CNN 模型

    具体的软硬件实现点击 http://mcu-ai.com/ MCU-AI技术网页_MCU-AI 声音事件的分类精度与特征提取有很强的关系.本文将深度特征用于环境声音分类(ESC)问题.深层特征是通过使 ...

  2. vue实现的常见的动画效果

    本文包括的动画: zoom-in zoom-in-left zoom-in-right zoom-in-top zoom-in-bottom zoom-in-center-x zoom-in-cent ...

  3. win11或win10客户端邮箱账号登录设置

    1.alimall阿里企业邮箱 点击账户 点击添加账户 点击其他账户 输入电子邮箱地址和密码,并点击登录即可 2.Qq邮箱 2.1 点击账户 2.2 点击添加账户 2.3 点击其他账户 2.4 输入电 ...

  4. go append的坑

    b := []int{1,2,3,4,5} slice := b[:2] newSlice := append(slice, 50) fmt.Println(b) fmt.Println(newSli ...

  5. Python并行运算——threading库详解(持续更新)

    0. 写在前面:进程和线程 博文参考: Python的并行(持续更新)_python 并行-CSDN博客 <Python并行编程 中文版> 一些相关概念请见上一篇博文. 1. 在Pytho ...

  6. 最全SpringBoot日志配置-按照日期和日志级别进行归档

    指定日志文件路径 在 spring的配置文件中配置: logging: config: classpath:logback.xm 日志配置 <?xml version="1.0&quo ...

  7. Windows Server系统 PaddleOCR失败解决方案

    因PaddleOCR引用了Opencv,在windows server 上 使用opencv出现 DLL load failed错误,发现缺失部分dll:MFPlat.dll.MF.dll.MFRea ...

  8. Qt-qrencode开发-生成、显示二维码📀

    Qt-qrencode开发-生成二维码 目录 Qt-qrencode开发-生成二维码 1.概述 2.实现效果 3.编译qrencode 4.在QT中引入编译为静态库的QRencode 5.在Qt中直接 ...

  9. 使用eNSP配置灵活QinQ

    参考链接:https://blog.csdn.net/xu119718/article/details/55260519 在"使用eNSP配置端口QinQ"实验中是基于端口划分的用 ...

  10. mybatis中的useGeneratedKeys="true"

    Springboot中 Mybatis 配置文件 Mapper参数useGeneratedKeys="true" keyProperty="id"useGene ...