洛谷 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; }

浙公网安备 33010602011771号