洛谷 P2723 丑数 Humble Numbers
题意
丑数的定义:对于一给定的素数集合 S = {p1, p2, ..., pK},考虑一个正整数集合,该集合中任一元素的质因数全部属于S。这个正整数集合包括,p1、p1p2、p1p1、p1p2p3...(还有其它)。该集合被称为S集合的“丑数集合”。注意:我们认为1不是一个丑数。
我们要做的就是给出K个质数,利用他们之间的相乘,求出第N个大的臭数
做法
这道题就是普通的数论题,并不用什么平衡树,详细思路可以看代码
代码
#include<bits/stdc++.h> using namespace std; int k,n; int a[105]; int q[105];//输入的K个质数属于的丑数 int s[100005];//记录找到的丑数 int main() { //freopen("humble.in","r",stdin); //freopen("humble.out","w",stdout); scanf("%d%d",&k,&n); s[0]=1;//第0个丑数,后面找规律要用到 for(int i=1;i<=k;++i) scanf("%d",&a[i]),q[i]=0;//所有的质数一开始都是属于第0个丑数的 int K=0;//记录找到了几个丑数 int minn;//记录每次找到的丑数 while(K<n) { minn=2e9; for(int i=1;i<=k;++i) if(s[q[i]]*a[i]<minn) minn=s[q[i]]*a[i];//寻找能找到的最小的丑数,这种算法要通过找规律发现 for(int i=1;i<=k;++i) if(s[q[i]]*a[i]==minn) q[i]++;//因为会有相同,但只能算一个,要for一遍比较,找到的那个质数所属于的那个丑数会自动更新成比它大的第一个丑数,理解一下 s[++K]=minn;//存入 } cout<<minn<<endl;//输出最后找到的丑数,也就是第N个丑数 return 0; }
标签:
数论
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】