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
思路:暴力吧,但是我只能说我STL写的太臭了!!!看了7个半小时别人的代码才勉强通过。
Executing...
Test 1: TEST OK [0.000 secs, 3360 KB]
Test 2: TEST OK [0.000 secs, 3360 KB]
Test 3: TEST OK [0.000 secs, 3360 KB]
Test 4: TEST OK [0.011 secs, 3492 KB]
Test 5: TEST OK [0.022 secs, 3888 KB]
Test 6: TEST OK [0.065 secs, 5604 KB]
Test 7: TEST OK [0.022 secs, 4020 KB]
Test 8: TEST OK [0.022 secs, 4020 KB]
Test 9: TEST OK [0.000 secs, 3360 KB]
Test 10: TEST OK [0.000 secs, 3360 KB]
Test 11: TEST OK [0.000 secs, 3360 KB]
Test 12: TEST OK [0.281 secs, 5604 KB]
All tests OK.
/* ID:wuhuaju2 PROG:humble LANG:C++ */ #include <cstdio> #include <iostream> #include <cstdlib> #include <algorithm> #include <cstring> #include <set> using namespace std; int a[110]; int n,p,l; set<int> s; void close() { fclose(stdin); fclose(stdout); exit(0); } void print(set<int> s) { set<int>::iterator it; for (it=s.begin();it!=s.end();it++) cout<<*it<<" "; cout<<endl; } void work() { } void init () { freopen("humble.in","r",stdin); freopen("humble.out","w",stdout); scanf("%d %d",&n,&p); for (int i=1;i<=n;i++) { scanf("%d",&a[i]); s.insert(a[i]); } for (int i=1;i<=n;i++) { set<int>::iterator it=s.begin(); while (2) { int t=(*it)*a[i]; if (t<0) break; // cout<<"t:"<<t<<endl; l=s.size(); if (l>p) { s.erase(--s.end()); if (t>*(--s.end())) break; } // print(s); s.insert(t); it++; } } cout<<*--s.end()<<endl; } int main () { init(); work(); close(); return 0; }