43 丑数
作者: Turbo时间限制: 1S章节: 枚举
问题描述 :
对于一给定的素数集合 S = {p1, p2, ..., pK}, 来考虑那些质因数全部属于S 的数的集合。
这个集合包括,p1, p1p2(即p1乘以p2), p1p3, 和 p1p2p3 (还有其它很多)。
这是个对于一个集合S的丑数集合。注意:我们不认为1 是一个丑数。
你的工作是对于输入的集合S去寻找集合中的第N个丑数。
说明:结果不超过32位整数能表示的范围
比如:S={2, 3, 5, 7}
则前15个丑数为:
2,3,4,5,6,7,8,9,10,12,14,15,16,18,20
输入说明 :
第 1 行: 2个被空格分开的整数:K 和 N , 1<= K<=100 , 1<= N<=100,000.
第 2 行: K 个被空格分开的整数,即集合S的元素
输出说明 :
单独的一行,即第N个丑数。
输入范例 :
4 15
2 3 5 7
输出范例 :
20
#include <iostream>
using namespace std;
#define MIN 2147483647
int p[101], step[101] = { 0 };//p[]存放质数 step[]存放位置
int ugly[100001];
int main()
{
int n, m;//n个数 求第m个
cin >> n >> m;
for (int i = 1; i <= n; i++)
{
cin >> p[i];
}
ugly[0] = 1;
for (int i = 1; i <= m; i++)
{
int min = MIN;
for (int j = 1; j <= n; j++)
{
int sum = p[j] * ugly[step[j]];
while (sum <= ugly[i - 1])
{
step[j]++;
sum = p[j] * ugly[step[j]];
}
if (min > sum)
min = sum;
}
ugly[i] = min;
}
cout << ugly[m] << endl;
return 0;
}