[可达鸭四月月赛——入门赛第六场(周六) T4]原初数题解

devtools/2024/9/19 5:21:20/ 标签: 算法

本题解署名:王胤皓

正文开始

题意

时间限制:1秒 内存限制:256M

题目描述

如果一个数字只由若干个不同的质数相乘得到,那么我们就称这个数字为“原初数”。本题中指的数字都是大于 1 1 1 的数字。

小可认为,原初数是一切数字的源头。当然,质数本身也是原初数。除了质数以外,比如 6 = 2 × 3 6=2\times 3 6=2×3 42 = 2 × 3 × 7 42=2\times 3\times 7 42=2×3×7 等都是原初数。但是 12 = 2 × 2 × 3 12=2\times 2\times 3 12=2×2×3 8 = 2 × 2 × 2 8=2\times2\times2 8=2×2×2 灯不是原初数。

例如 6 = 2 1 × 3 1 6=2^1\times3^1 6=21×31 如果有一个不是原初数的数字,只有 2 2 2 3 3 3 作为质因数,那么这个数字称为 6 6 6 的子数。比如 6 6 6 的子数有 12 、 24 、 36 12、24、36 122436 等。但是 15 15 15 等数字不是 6 6 6 的子数。

但是数字是无穷的。于是小可决定把范围限制在 [ 2 , n ] [2,n] [2,n] 内。然后小可会在这个范围内给你 m m m 个数字。

如果小可给的数字是原初数,请从小到大输出这个原初数的子数有哪些。当然,这些子数都得在 [ 2 , n ] [2,n] [2,n] 的范围内。

如果小可给的数字不是原初数,那么输出这个数字的原初数。具体格式见输出描述和样例。

输入描述

第一行两个正整数 n , m n,m n,m,代表小可划定的范围为 [ 2 , n ] [2,n] [2,n],小可会在这个范围内给你 m m m个数字。

第二行 m m m 个正整数​​ a 1 , a 2 ⋯ , a m a_1,a_2\cdots,a_m a1,a2,am,代表小可给你的 m m m 个数字。

输出描述

对于每个给定的数字,如果它是原初数,那么首先输出 A: ,然后输出这个数字的子数,从小到大排列。

如果这个数字不是原初数,那么首先输出 B: ,然后输出这个数字的原初数。

注意,冒号是英文冒号。冒号后面有一个空格。

每个给定的数字的输出占一行。具体情况参考样例。

样例输入

100 10
2 3 91 24 50 75 12 15 20 100

样例输出

A: 4 8 16 32 64
A: 9 27 81
A:
B: 6
B: 10
B: 15
B: 6
A: 45 75
B: 10
B: 10

提示

如果把原初数分解成质因数相乘的形式,可以发现,每个质数的指数都是 1 1 1。比如 10 = 2 1 × 5 1 10=2^1\times5^1 10=21×51

子数就是在原初数的基础上,某些质因数的指数大于 1 1 1。比如 10 10 10 的子数有 2 3 × 5 1 , 2 2 × 5 4 2^3\times5^1,2^2\times5^4 23×51,22×54等等。

数据范围

对于 20 % 20\% 20% 的数据, 2 ≤ n ≤ 20 , 1 ≤ m ≤ 10 2\le n\le20,1\le m\le10 2n20,1m10

对于另外 20 % 20\% 20% 的数据, 2 ≤ n ≤ 1000 , 1 ≤ m ≤ 1000 2\le n\le1000,1\le m\le1000 2n1000,1m1000

对于另外 20 % 20\% 20% 的数据, 2 ≤ n ≤ 1 0 4 , 1 ≤ m ≤ 1 0 4 2\le n\le10^4,1\le m\le10^4 2n104,1m104

对于另外 20 % 20\% 20% 的数据, 2 ≤ n ≤ 2 × 1 0 6 , 1 ≤ m ≤ 1000 2\le n\le2\times10^6,1\le m\le1000 2n2×106,1m1000

对于另外 20 % 20\% 20% 的数据, 2 ≤ n ≤ 3 × 1 0 6 , 1 ≤ m ≤ 3 × 1 0 6 2\le n\le3\times10^6,1\le m\le3\times10^6 2n3×106,1m3×106

对于 100 % 100\% 100% 的数据,保证小可给定的 m m m 个数字中的原初数的个数不超过 5 × 1 0 4 5\times 10^4 5×104

思路

upd:这题我问的王弘毅老师,王弘毅老师把他代码中的 Euler 函数给我看了看,然后我想了想主函数的内容,然后就 AC \colorbox{52C41A}{\color{white}{\texttt{AC}}} AC 了。

这题卡的比较紧,稍不注意就会得到 TLE \colorbox{052242}{\color{white}{\texttt{TLE}}} TLE 的好成绩(作者经历了 1 1 1 OLE \colorbox{052242}{\color{white}{\texttt{OLE}}} OLE, 4 4 4 TLE \colorbox{052242}{\color{white}{\texttt{TLE}}} TLE, 2 2 2 MLE \colorbox{052242}{\color{white}{\texttt{MLE}}} MLE 2 2 2 RE \colorbox{9D3DCF}{\color{white}{\texttt{RE}}} RE 2 2 2 WA \colorbox{E74C3C}{\color{white}{\texttt{WA}}} WA AC \colorbox{52C41A}{\color{white}{\texttt{AC}}} AC 的)。

首先进行一遍欧拉筛,筛出质数,然后顺便打出每个数的原初数是多少:

  • 如果这个数是质数,那么这个数的原初数就是这个数,所以 f i = i f_i=i fi=i
  • 在进行欧拉筛的时候,在遍历质数表的时候,加入一下语句:
    • 在判断 i m o d p r i m e j = 0 i\bmod prime_j=0 imodprimej=0 的时候,那么 f i × p r i m e j = f i f_{i\times prime_j}=f_i fi×primej=fi
      • 证明:因为 p r i m e j prime_j primej i i i 的一个因数,所以不需要再乘,直接相等即可。
    • 否则 f i × p r i m e j = f i × p r i m e j f_{i\times prime_j}=f_{i}\times prime_j fi×primej=fi×primej
      • 证明:因为 p r i m e j prime_j primej 不是 i i i 的一个因数,所以需要再乘,乘起来即可。

进行完之后,用 3 × 1 0 6 3\times10^6 3×106vector 存储原初数对应的这个原初数的 子数,但是如果 f i = i f_i=i fi=i,那么就说明这是个原初数,不统计。

主函数内:
先调用函数。
接下来 m m m 组:
如果 f a i = a i f_{a_i}=a_i fai=ai,那么这个数是一个原初数,输出 A: a n s a i ans_{a_i} ansai 的全部内容。
否则输出 B: f a i f_{a_i} fai

代码实现

#include<bits/stdc++.h>
using namespace std;
int n,m,cnt,pr[3000005],f[3000005];
bool vis[3000005];
vector<int> ans[3000005];
void Euler(int n){for(int i=2; i<=n; i++){if(!f[i]){pr[cnt++]=i;f[i]=i;}for(int j=0; j<cnt&&i*pr[j]<=n; j++){vis[pr[j]*i]=1;if(i%pr[j]==0){f[i*pr[j]]=f[i];break;}f[i*pr[j]]=f[i]*pr[j];}}for(int i=2; i<=n; i++){if(f[i]==i) continue;ans[f[i]].push_back(i);}
}
int main(){cin.tie(0);cout.tie(0);ios::sync_with_stdio(false);cin>>n>>m;Euler(n);while(m--){int a;cin>>a;if(f[a]==a){cout<<"A: ";for(int i=0; i<ans[a].size()&&ans[a][i]<=n; i++) cout<<ans[a][i]<<" ";cout<<"\n";}else{cout<<"B: ";cout<<f[a]<<"\n";}}return 0;
}

三连一下再走吧~


http://www.ppmy.cn/devtools/21101.html

相关文章

循环单链表的介绍与操作

定义 区别 链表合并 整合代码 typedef struct node{int data;node* next;; }lnode,*linklist; lnode* n; linklist l;//定义 void init(linklist &l){lnode lnew lnode;l->nextl;lnode *rl; } //单循环链表的合并 linklist merge(linklist &a,linklist b){//存头结…

ES5、ES6类的定义

ES5定义类 1、类名首字母一般都是大写 2、可以当成普通函数调用&#xff0c;但一般都通过new关键字调用&#xff0c;通过关键字调用会生成一个新的对象 3、通过new关键字创建的对象&#xff0c;给当前的this绑定成新创建的对象 4、给当前类定义一个方法&#xff0c;通常绑定在…

前端工程化Vue使用Node.js设置国内高速npm镜像源(踩坑记录版)

前端工程化Vue使用Node.js设置国内高速npm镜像源&#xff08;踩坑记录版&#xff09; 此篇仅为踩坑记录&#xff0c;并未成功更换高速镜像源&#xff0c;实际解决方法见文末跳转链接。 1.自身源镜像 自身镜像源创建Vue项目下载速度感人 2.更改镜像源 2.1 通过命令行配置 前提…

【PyTorch】3-基础实战(ResNet)

PyTorch&#xff1a;3-基础实战 注&#xff1a;所有资料来源且归属于thorough-pytorch(https://datawhalechina.github.io/thorough-pytorch/)&#xff0c;下文仅为学习记录 3.1&#xff1a;ResNet基本介绍 退化现象&#xff08;degradation&#xff09;&#xff1a;增加网络…

模型实战(19)之 从头搭建yolov9环境+tensorrt部署+CUDA前处理 -> 实现目标检测

从头搭建yolov9环境+tensorrt部署实现目标检测 yolov9虚拟环境搭建实现训练、推理与导出导出onnx并转为tensorrt模型Python\C++ - trt实现推理,CUDA实现图像前处理文中将给出详细实现源码python、C++效果如下:output_video_1 1. 搭建环境 拉去官方代码根据配置下载虚拟环境所…

正则表达式的常见语法

目录 一、基本的正则表达式语法 1.1 字符类 1.2 单个字符的特殊表示 1.3 量词表示 1.4 边界匹配 1.5 分组与捕获 二 、java中的使用 在Java中使用正则表达式进行字符串匹配可以说是一个很重要的技能&#xff0c;尤其对于需要进行文本处理或者字符替换的程序来说&#xff0…

前端三剑客 HTML+CSS+JavaScript ⑤ HTML文本标签

别困在过去&#xff0c;祝你有勇气开始&#xff0c;下一行 —— 24.4.24 一、文本标签 1.特点 1.用于包裹&#xff1a;词汇、短语等 2.通常写在排版标签里面&#xff08;h1~h6、p、div&#xff09; 3.排版标签更宏观&#xff08;大段的文字&#xff09;&#xff0c;文本标签更微…

智慧码头港口:施工作业安全生产AI视频监管与风险预警平台方案

一、建设思路 随着全球贸易的快速发展&#xff0c;港口作为连接海洋与内陆的关键节点&#xff0c;其运营效率和安全性越来越受到人们的关注。为了提升港口的运营效率和安全性&#xff0c;智慧港口视频智能监控系统的建设显得尤为重要。 1&#xff09;系统架构设计 系统应该采…

【Redis(8)】Spring Boot整合Redis和Guava,解决缓存穿透、缓存击穿、缓存雪崩等缓存问题

在缓存技术的挑战及设计方案我们介绍了使用缓存技术可能会遇到的一些问题&#xff0c;那么如何解决这些问题呢&#xff1f; 在构建缓存系统时&#xff0c;Spring Boot和Redis的结合提供了强大的支持&#xff0c;而Guava的LoadingCache则为缓存管理带来了便捷的解决方案。下面我…

谁在钉钉上做AI Agent?

在这个中国最大的TO B流量池里&#xff0c;有最适合AI Agent生长的“原生”环境&#xff0c;有足够有边界的平台设计&#xff0c;也更有无数真实可见的AI产业需求&#xff0c;和已经在全面开放的数据和TO B服务流程&#xff0c;这些串联到一起也恰构成着AI在中国产业落地的最丰…

【C++类和对象】探索static成员、友元以及内部类

&#x1f49e;&#x1f49e; 前言 hello hello~ &#xff0c;这里是大耳朵土土垚~&#x1f496;&#x1f496; &#xff0c;欢迎大家点赞&#x1f973;&#x1f973;关注&#x1f4a5;&#x1f4a5;收藏&#x1f339;&#x1f339;&#x1f339; &#x1f4a5;个人主页&#x…

OpenHarmony实战开发-如何实现进度条 (Progress)

Progress是进度条显示组件&#xff0c;显示内容通常为目标操作的当前进度。 创建进度条 Progress通过调用接口来创建&#xff0c;接口调用形式如下&#xff1a; Progress(options: {value: number, total?: number, type?: ProgressType}) ts其中&#xff0c;value用于设置…

从零开始的vscode配置及安装rust教程

配置vscode的rust环境 下载安装vscodemac 环境1. 下载安装rust2. 配置 mac vscode环境3. 创建一个测试项目 windows 环境1. 安装c运行环境2. 安装配置rustup3. 配置windows vscode环境4. 创建一个测试项目 下载安装vscode 1.官网应用程序下载 vscode&#xff1a;https://code.v…

阿里云难题学习笔记

1、下列内存区段增长方是向低地址方向的有&#xff08; &#xff09;&#xff1f; A: 文本段 B: 数据段 C: 堆区 D: 栈区 解析&#xff1a; 在内存管理中&#xff0c;不同的内存区段增长方向是不同的。栈区&#xff08;Stack&#xff09;的增长方向是向低地址方向的&…

Python爬虫--Scrapy框架安装

Scrapy框架安装 &#xff0c; Scrapy 是 Python 领域专业的爬虫开发框架&#xff0c;已经完成爬虫程序的大部分通用工具 它使用了 Twisted 异步网络库来处理网络通讯。整体架构大致如下 第一步&#xff1a;挂小灰机或者将要安装的文件下载到本地 Scrapy 框架安装踩坑中 为什…

Python_AI库 Matplotlib的应用简例:绘制与保存折线图

本文默认读者已具备以下技能&#xff1a; 熟悉Python基础语法&#xff0c;以自行阅读python代码块熟悉Vscode或其它编辑工具的应用 在数据可视化领域&#xff0c;Matplotlib无疑是一个强大的工具。它允许我们创建各种静态、动态、交互式的可视化图形&#xff0c;帮助我们更好…

C 练习实例36 - 求100之内的素数

C 练习实例36 - 求100之内的素数 题目&#xff1a; 求100之内的素数。 程序分析&#xff1a; 质数&#xff08;prime number&#xff09;又称素数&#xff0c;有无限个。一个大于1的自然数&#xff0c;除了1和它本身外&#xff0c;不能被其他自然数整除。 程序源代码&#x…

排序试题解析(二)

8.4.3 01.在以下排序算法中&#xff0c;每次从未排序的记录中选取最小关键字的记录&#xff0c;加入已排序记录的 末尾&#xff0c;该排序算法是( A ). A.简单选择排序 B.冒泡排序 C.堆排序 D.直接插入排序 02&#xff0e;简单选择排序算法的比较次数和移动次数分别为( C )。…

STM32标准库外部中断和定时器知识点总结

目录 前言 一、EXIT外部中断 &#xff08;1&#xff09;对射式红外传感器计次 &#xff08;2&#xff09;旋转编码器计次 二、TIM定时器 1.定时器定时中断 2.定时器外部时钟 3.TIM输出比较 &#xff08;1&#xff09;PWM驱动呼吸灯 &#xff08;2&#xff09;PWM驱动舵…

介绍一个开源IOT组态项目

项目介绍 金合可视化平台是一款强大而操作简便的低代码平台&#xff0c;专为满足物联网领域的可视化开发需求而设计。通过该平台&#xff0c;用户可以利用拖拽配置的方式&#xff0c;轻松创建个性化的可视化大屏&#xff0c;无需熟练的编程技能&#xff0c;大幅提高了开发效率。…