寻找丑数
题目描述:
对于一给定的素数集合 S = { p1, p2, ... , pk } , 来考虑正整数集合中哪些数的质因数全部属于S。
这个正整数集合包括,p1, p1p2, p1p1, 和 p1p2p3 (还有其它)。这是个对于一个输入的S集合的丑数集合。 注意:我们不认为1 是一个丑数。 你的工作是对于输入的集合S去寻找集合中的第N个丑数。long long对于程序是足够的。
输入格式:
第 1 行: 二个被空格分开的整数:K 和 N , 1<= K<=100 , 1<= N<=100,000. 第 2 行: K 个被空格分开的整数:集合S的元素
输出格式:
单独的一行,写上对于输入的S的第N个丑数。
样例输入:
4 19 2 3 5 7
样例输出:
27
时间限制: 500ms
空间限制: 128MB
来源: USACO
#include<bits/stdc++.h>
using namespace std;
int k,n;
int a[105];
int q[105];
int s[100005];
int main() {
scanf("%d%d",&k,&n);
s[0]=1;
for(int i=1; i<=k; ++i)
scanf("%d",&a[i]),q[i]=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]++;
s[++K]=minn;
}
cout<<minn<<endl;
return 0;
}