USACO 3.1 Humble Numbers

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

 

这道题目也是一道常见题目,是一种步步递进的方式获取最终的结果。

时间复杂度为Ok×n),但是由于系数很小,因此最后时间仍然非常快,最复杂的情况也仅仅有0.076ms

USER: millky wang [ts_mill1]

TASK: humble

LANG: C++

 

Compiling...

Compile: OK

 

Executing...

   Test 1: TEST OK [0.000 secs, 3112 KB]

   Test 2: TEST OK [0.000 secs, 3112 KB]

   Test 3: TEST OK [0.022 secs, 3112 KB]

   Test 4: TEST OK [0.000 secs, 3108 KB]

   Test 5: TEST OK [0.011 secs, 3112 KB]

   Test 6: TEST OK [0.011 secs, 3112 KB]

   Test 7: TEST OK [0.022 secs, 3108 KB]

   Test 8: TEST OK [0.000 secs, 3112 KB]

   Test 9: TEST OK [0.011 secs, 3108 KB]

   Test 10: TEST OK [0.011 secs, 3112 KB]

   Test 11: TEST OK [0.000 secs, 3112 KB]

   Test 12: TEST OK [0.076 secs, 3112 KB]

  1. /*
  2. ID: millky
  3. PROG: humble
  4. LANG: C++
  5. */
  6. #include <iostream>
  7. #include <fstream>
  8. #include <string>
  9. #include <cmath>
  10. #include <cstdio>
  11. #include <algorithm>
  12. #include <vector>
  13. #include<iomanip>
  14. using namespace std;
  15. struct factor 
  16. {
  17.     int prime,pt,val;
  18. };
  19. bool myComp(const factor& A,const factor& B)
  20. {
  21.     return A.prime<B.prime;
  22. }
  23. int k,n,humble[100000],ea[100],ean;
  24. factor primes[100];
  25. int main()
  26. {
  27.     freopen("humble.in","r",stdin);
  28.     freopen("humble.out","w",stdout);
  29.     int cur,curI;
  30.     scanf("%d%d",&k,&n);
  31.     for (int i=0;i<k;++i) {
  32.         scanf("%d",&primes[i].prime);
  33.         primes[i].pt=0;
  34.         primes[i].val=primes[i].prime;
  35.     }
  36.     sort(primes,primes+k,myComp);
  37.     for (int i=0;i<n;++i)
  38.     {
  39.         ean=0;
  40.         cur=primes[0].val;
  41.         for (int j=1;j<k;++j)
  42.             if(primes[j].val<cur)
  43.                 cur=primes[j].val;
  44.         humble[i]=cur;
  45.         for (int j=0;j<k;++j)
  46.             if(primes[j].val==cur)
  47.                 primes[j].val=primes[j].prime*humble[primes[j].pt++];       
  48.     }
  49.     printf("%d/n",humble[n-1]);
  50.     return 0;
  51. }
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值