For a given set of K prime numbers S = {p1, p2, ..., pK}, consider the set of all numbers whose prime factors are a subset of S. This set contains, for example, p1, p1p2, p1p1, and p1p2p3 (among others). This is the set of `humble numbers' for the input set S. Note: The number 1 is explicitly declared not to be a humble number.
Your job is to find the Nth humble number for a given set S. Long integers (signed 32-bit) will be adequate for all solutions.
PROGRAM NAME: humble
INPUT FORMAT
Line 1: | Two space separated integers: K and N, 1 <= K <=100 and 1 <= N <= 100,000. |
Line 2: | K space separated positive integers that comprise the set S. |
SAMPLE INPUT (file humble.in)
4 19 2 3 5 7
OUTPUT FORMAT
The Nth humble number from set S printed alone on a line.
SAMPLE OUTPUT (file humble.out)
27
题意:
给出 N(1 ~ 100)个素数 和 K (1 ~ 100000)。输出第 K 个数,这个数的质因子只能由这 N 个里面的数组成。规定 1 不算入其中。
思路:
技巧。与第二次个人排位赛素数筛选那道题类似,为了方便计算,所以把 1 也算入其中。用数组 hum 记录前 100000 个数( hum 数组绝对是从小到大排序的 ),更新的时候只需要更新到 K 为止。对于每一个素数 num[ i ] 对应都有一个下标值 fir [ i ]。当需要更新第 j 个 hum 时,每个一个素数都要找到第一个 fir [ i ] 满足 num [ i ] * hum [ fir [ i ] ] > hum [ j - 1 ] ,同时比较取得每个素数 num [ i ] * hum [ fir [ i ] ] 的最小值,这个最小值即为 hum [ j ] 的值。如此更新下去,最后输出 hum [ k ] 即可。
AC:
/*
TASK:humble
LANG:C++
ID:sum-g1
*/
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
const ll INF = 999999999999;
ll num[105], fir[105];
ll hum[100005];
int main() {
freopen("humble.in", "r", stdin);
freopen("humble.out", "w", stdout);
int n, k;
scanf("%d%d", &n, &k);
for (int i = 1; i <= n; ++i) {
scanf("%lld", &num[i]);
fir[i] = 0;
}
hum[0] = 1;
for (int i = 1; i <= k; ++i) {
ll Min = INF;
for (int j = 1; j <= n; ++j) {
while (num[j] * hum[ fir[j] ] <= hum[i - 1]) ++fir[j];
if (num[j] * hum[ fir[j] ] < Min)
Min = num[j] * hum[ fir[j] ];
}
hum[i] = Min;
}
printf("%lld\n", hum[k]);
return 0;
}