题目描述
Description
对于一给定的素数集合 S = {p1, p2, …, pK},如果一个数字,当我们对其做完质因子分解后,其质因子全是来自我们给定的素数集合,则认为这个数字是个丑数。
注意:我们不认为1 是一个丑数。
你的工作是对于输入的集合S去寻找第N个丑数。
Input
第 1 行: 二个被空间分开的整数:K 和 N , 1<= K<=100 , 1<= N<=100,000.
第 2 行: K 个被空间分开的整数:集合S的元素
Output
第N个丑数。
Sample Input
4 19
2 3 5 7
Sample Output
27
思路
为了找第i个丑数,那么一定要比第i-1个丑数大,而且是最小的那一个,可以发现比i-1大的丑数一定是比i-1小的丑数乘某个质数得到的,鉴于质数的数量很少,而丑数的数量很大,我们枚举质数,然后枚举丑数,直到大于第i-1个丑数,记录一下,找到所有的符合条件的丑数以后,找出最小值(也可以在寻找的途中更新最小值),那么这个最小值就是第i个丑数。
代码
1 #include<bits/stdc++.h> 2 using namespace std; 3 int n,m; 4 int a[101],b[101],s[100001]={1}; 5 int main() 6 { 7 cin>>n>>m; 8 for(int i=1;i<=n;i++) 9 cin>>a[i]; 10 for(int i=1;i<=m;i++) 11 { 12 int minn=0x7f7f7f7f; 13 for(int j=1;j<=n;j++) 14 { 15 while(a[j]*s[b[j]]<=s[i-1]) 16 { 17 b[j]++; 18 } 19 if(a[j]*s[b[j]]<minn) 20 minn=a[j]*s[b[j]]; 21 } 22 s[i]=minn; 23 } 24 cout<<s[m]<<endl; 25 return 0; 26 }