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

server/2024/9/24 11:00:07/

本题解署名:王胤皓

正文开始

题意

时间限制: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/server/13875.html

相关文章

【Interconnection Networks 互连网络】Dragonfly Topology 蜻蜓网络拓扑

蜻蜓拓扑 Dragonfly Topology 1. 拓扑参数2. Topology Description 拓扑描述3. Topology Variations 拓扑变体 蜻蜓拓扑 Dragonfly Topology 1. 拓扑参数 Dragonfly拓扑参数&#xff1a; N N N: 网络中终端(terminal)的总数量 p p p: 连接到每个路由器的终端数量 a a a: 每…

vue 3 + TS 组合式标注类型

1.组件的 emits 标注类型 <script setup lang"ts"> // 运行时 const emit defineEmits([change, update])// 基于选项 const emit defineEmits({change: (id: number) > {// 返回 true 或 false// 表明验证通过或失败},update: (value: string) > {//…

测试用例设计方法-异常测试

飞的最高的海鸥&#xff0c;能看到最远的奇景。大家好&#xff0c;继续给大家分享如何进行异常测试&#xff0c;首先要做好异常测试&#xff0c;需要我们对被测系统进行全面的了解&#xff0c;熟悉被测系统的功能、架构和运行机制&#xff0c;然后在这个基础上尽可能覆盖各种的…

K8s: 在Pod中使用亲和性调度节点

用节点亲和性把 Pods 分配到节点 在 K8s 集群中&#xff0c;如何使用节点亲和性把 Pod 分配到特定节点机器资源各不相同&#xff0c;配置不同&#xff0c;一些应用对配置有要求的需要部署到相关机器上应用场景 场景1: 对读写性能要求较高的pod部署到安装ssd的机器上场景2: 把同…

嵌入式开发中模板方法模式实现

模板方法模式 模板方法模式&#xff08;Template Method Pattern&#xff09;是一种行为设计模式&#xff0c;它在父类中定义了一个算法的框架&#xff0c;允许子类在不改变结构的情况下重写某些步骤。这种模式体现了“封装不变部分&#xff0c;扩展可变部分”的原则&#xff…

ZeRO论文阅读

一.前情提要 1.本文理论为主&#xff0c;并且仅为个人理解&#xff0c;能力一般&#xff0c;不喜勿喷 2.本文理论知识较为成体系 3.如有需要&#xff0c;以下是原文&#xff0c;更为完备 Zero 论文精读【论文精读】_哔哩哔哩_bilibili 二.正文 1.前言 ①为什么用该技术&…

JRT多服务器同步程序

之前的JRT只部署在一个服务器&#xff0c;实际运用可能会有数台、数十台、或者更多服务器。那么多台服务器就需要程序同步机制。这里借助Rsync同步&#xff0c;但是有个问题是Rsync同步jar之后他不知道是否需要重启站点&#xff0c;为此实现java控制台驱动Rsync&#xff0c;重定…

解决“ImportError: DLL load failed while importing _rust: 找不到指定的程序的问题

运行 scrapy startproject wikiSpider 报错&#xff1a;ImportError: DLL load failed while importing _rust: 找不到指定的程序。 经过尝试 可以更换Python解释器版本来解决 1、点击crtlalts打开设置 点击项目>解释器 选择3.11解释器 &#xff08;我原来报错用的3.9的解…