Humble Numbers - USACO 3.1.3


humblenumbers - codetrick
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个元素。其中质数至多有100个,求的元素至多第是10,000个。
如给定的质数是{2,3,5},则生成的数组为{2,3,2*2,5,2*3,2*2*2,3*3,2*5….}
https://github.com/antonio081014/USACO-Training/blob/master/ch3_1/humble.java
https://github.com/TomConerly/Competition-Programming/blob/master/USACO/Chapter3/humble.java

static int solve2(int[] nums, int N ,int K) {
int[] hum = new int[N+1];
int[] next = new int[K];
hum[0] = 1;
for(int i = 1; i <= N;i++)
{
int best = Integer.MAX_VALUE;
for(int j = 0; j < K;j++)
{
while(next[j] < i && nums[j]*hum[next[j]] <= hum[i-1])
{
next[j]++;
}
best = min(best,nums[j]*hum[next[j]]);
}
hum[i] = best;
}
return hum[N];
}
https://github.com/lklein/usaco-training/blob/master/usaco/humble/humble.java

public long solve(int n, long[] primes) {
ArrayList<Long> humbles = new ArrayList<Long>();
humbles.add(1L);
// This is key
int[] cursor = new int[primes.length];
while (humbles.size() < n + 1) {
long newMin = Long.MAX_VALUE;
for (int j = 0; j < primes.length; j++) {
newMin = Math.min(primes[j] * humbles.get(cursor[j]), newMin);
}
humbles.add(newMin);
for (int j = 0; j < primes.length; j++) {
while (primes[j] * humbles.get(cursor[j]) <= newMin) {
cursor[j]++;
}
}
}
return humbles.get(n);
}
http://sdjl.me/index.php/archives/117
    private static void run()
    {
        //为了计算方便,我们认为第一个humble数为1
        humbles[0] = 1;
        //依次求出humbles[i]
        for (int i = 1; i <= n; i++)
        {
            humbles[i] = Integer.MAX_VALUE;
            //考虑每一个素数
            for (int j = 0; j < k; j++)
            {
                //找到比上一个humble还大的乘积:a
                while (primes[j] * humbles[multiplyIndex[j]] <= humbles[i - 1])
                {
                    multiplyIndex[j]++;
                }
                //humble[i]为每一个素数所得a中的最小值
                humbles[i] = Math.min(humbles[i], primes[j] * humbles[multiplyIndex[j]]);
            }
        }
        answer = humbles[n];
    }
http://blog.csdn.net/linraise/article/details/12587585
  1. int pIndex[101],Ugly[100005];  
  2. void Ugly_Num(int* Prime,int K,int N)  
  3. {  
  4.     int i,j,min,minIndex;  
  5.     for(i=0;i<K;++i)  
  6.         pIndex[i]=0;//初始化为0,因为初始状态第i个状态已经乘到0位,0位的值是1  
  7.     Ugly[0]=1;  
  8.     for(i=1;i<=N;)//找出从1到N的丑数,太暴力了,提示:注意第3位置留空!!!  
  9.     {  
  10.         min=INT_MAX;  
  11.         for(j=0;j<K;++j)//找到最小值,K个素数分别和之前的丑数相乘求出最小的那一个  
  12.         {  
  13.             //(j,pIndex[j])表示第j个素数已经乘到了第pIndex[j]位了,比如说8=2*4,2是第0个素数,4是第3位,则pIndex[0]=3  
  14.             //下一次,prime[j]乘pIndex[j]+1位就可以了,因为再乘之前的也只会比这小  
  15.             if(Prime[j]*Ugly[pIndex[j]] < min)  
  16.             {  
  17.                 min=Prime[j]*Ugly[pIndex[j]];  
  18.                 minIndex=j;//最小的素数索引  
  19.             }  
  20.         }  
  21.         if( min != Ugly[i-1]) //如果和之前的不一样,更新之,否则只更新相乘的位,因为下一次对应的素数要乘更大的丑数  
  22.             Ugly[i++]=min;  
  23.         ++pIndex[minIndex];//素数索引  
  24.     }  
  25.     cout<<Ugly[N]<<endl;  
http://www.cnblogs.com/hoskey/p/3803083.html
13 int main()
14 {
15     ll k,n,i,j,l,minp=0;
16     //文件操作
17     freopen("humble.in","r",stdin);
18     freopen("humble.out","w",stdout);
19     memset(low,0,sizeof(low));
20     scanf("%lld%lld",&k,&n);
21     for (i=1;i<=k;i++) scanf("%lld",&S[i]);
22     sort(S+1,S+1+k);//排序 
23     N[0]=1;//初始化 
24     for (i=1;i<=n;i++)//求第I个丑数 
25     {
26         ll temp=0x7fffffff;
27         for (j=1;j<=k;j++)
28         {
29             while (S[j]*N[low[j]]<=N[i-1]) low[j]++;
30             if (S[j]*N[low[j]]<temp)
31             {
32                 temp=S[j]*N[low[j]];
33                 minp=j;
34             }
35         }
36         N[i]=temp;
37         low[minp]++;
38     }
39     printf("%lld",N[n]);
40     return 0;
41 }
Read full article from humblenumbers - codetrick

Labels

LeetCode (1432) GeeksforGeeks (1122) LeetCode - Review (1067) Review (882) Algorithm (668) to-do (609) Classic Algorithm (270) Google Interview (237) Classic Interview (222) Dynamic Programming (220) DP (186) Bit Algorithms (145) POJ (141) Math (137) Tree (132) LeetCode - Phone (129) EPI (122) Cracking Coding Interview (119) DFS (115) Difficult Algorithm (115) Lintcode (115) Different Solutions (110) Smart Algorithm (104) Binary Search (96) BFS (91) HackerRank (90) Binary Tree (86) Hard (79) Two Pointers (78) Stack (76) Company-Facebook (75) BST (72) Graph Algorithm (72) Time Complexity (69) Greedy Algorithm (68) Interval (63) Company - Google (62) Geometry Algorithm (61) Interview Corner (61) LeetCode - Extended (61) Union-Find (60) Trie (58) Advanced Data Structure (56) List (56) Priority Queue (53) Codility (52) ComProGuide (50) LeetCode Hard (50) Matrix (50) Bisection (48) Segment Tree (48) Sliding Window (48) USACO (46) Space Optimization (45) Company-Airbnb (41) Greedy (41) Mathematical Algorithm (41) Tree - Post-Order (41) ACM-ICPC (40) Algorithm Interview (40) Data Structure Design (40) Graph (40) Backtracking (39) Data Structure (39) Jobdu (39) Random (39) Codeforces (38) Knapsack (38) LeetCode - DP (38) Recursive Algorithm (38) String Algorithm (38) TopCoder (38) Sort (37) Introduction to Algorithms (36) Pre-Sort (36) Beauty of Programming (35) Must Known (34) Binary Search Tree (33) Follow Up (33) prismoskills (33) Palindrome (32) Permutation (31) Array (30) Google Code Jam (30) HDU (30) Array O(N) (29) Logic Thinking (29) Monotonic Stack (29) Puzzles (29) Code - Detail (27) Company-Zenefits (27) Microsoft 100 - July (27) Queue (27) Binary Indexed Trees (26) TreeMap (26) to-do-must (26) 1point3acres (25) GeeksQuiz (25) Merge Sort (25) Reverse Thinking (25) hihocoder (25) Company - LinkedIn (24) Hash (24) High Frequency (24) Summary (24) Divide and Conquer (23) Proof (23) Game Theory (22) Topological Sort (22) Lintcode - Review (21) Tree - Modification (21) Algorithm Game (20) CareerCup (20) Company - Twitter (20) DFS + Review (20) DP - Relation (20) Brain Teaser (19) DP - Tree (19) Left and Right Array (19) O(N) (19) Sweep Line (19) UVA (19) DP - Bit Masking (18) LeetCode - Thinking (18) KMP (17) LeetCode - TODO (17) Probabilities (17) Simulation (17) String Search (17) Codercareer (16) Company-Uber (16) Iterator (16) Number (16) O(1) Space (16) Shortest Path (16) itint5 (16) DFS+Cache (15) Dijkstra (15) Euclidean GCD (15) Heap (15) LeetCode - Hard (15) Majority (15) Number Theory (15) Rolling Hash (15) Tree Traversal (15) Brute Force (14) Bucket Sort (14) DP - Knapsack (14) DP - Probability (14) Difficult (14) Fast Power Algorithm (14) Pattern (14) Prefix Sum (14) TreeSet (14) Algorithm Videos (13) Amazon Interview (13) Basic Algorithm (13) Codechef (13) Combination (13) Computational Geometry (13) DP - Digit (13) LCA (13) LeetCode - DFS (13) Linked List (13) Long Increasing Sequence(LIS) (13) Math-Divisible (13) Reservoir Sampling (13) mitbbs (13) Algorithm - How To (12) Company - Microsoft (12) DP - Interval (12) DP - Multiple Relation (12) DP - Relation Optimization (12) LeetCode - Classic (12) Level Order Traversal (12) Prime (12) Pruning (12) Reconstruct Tree (12) Thinking (12) X Sum (12) AOJ (11) Bit Mask (11) Company-Snapchat (11) DP - Space Optimization (11) Dequeue (11) Graph DFS (11) MinMax (11) Miscs (11) Princeton (11) Quick Sort (11) Stack - Tree (11) 尺取法 (11) 挑战程序设计竞赛 (11) Coin Change (10) DFS+Backtracking (10) Facebook Hacker Cup (10) Fast Slow Pointers (10) HackerRank Easy (10) Interval Tree (10) Limited Range (10) Matrix - Traverse (10) Monotone Queue (10) SPOJ (10) Starting Point (10) States (10) Stock (10) Theory (10) Tutorialhorizon (10) Kadane - Extended (9) Mathblog (9) Max-Min Flow (9) Maze (9) Median (9) O(32N) (9) Quick Select (9) Stack Overflow (9) System Design (9) Tree - Conversion (9) Use XOR (9) Book Notes (8) Company-Amazon (8) DFS+BFS (8) DP - States (8) Expression (8) Longest Common Subsequence(LCS) (8) One Pass (8) Quadtrees (8) Traversal Once (8) Trie - Suffix (8) 穷竭搜索 (8) Algorithm Problem List (7) All Sub (7) Catalan Number (7) Cycle (7) DP - Cases (7) Facebook Interview (7) Fibonacci Numbers (7) Flood fill (7) Game Nim (7) Graph BFS (7) HackerRank Difficult (7) Hackerearth (7) Inversion (7) Kadane’s Algorithm (7) Manacher (7) Morris Traversal (7) Multiple Data Structures (7) Normalized Key (7) O(XN) (7) Radix Sort (7) Recursion (7) Sampling (7) Suffix Array (7) Tech-Queries (7) Tree - Serialization (7) Tree DP (7) Trie - Bit (7) 蓝桥杯 (7) Algorithm - Brain Teaser (6) BFS - Priority Queue (6) BFS - Unusual (6) Classic Data Structure Impl (6) DP - 2D (6) DP - Monotone Queue (6) DP - Unusual (6) DP-Space Optimization (6) Dutch Flag (6) How To (6) Interviewstreet (6) Knapsack - MultiplePack (6) Local MinMax (6) MST (6) Minimum Spanning Tree (6) Number - Reach (6) Parentheses (6) Pre-Sum (6) Probability (6) Programming Pearls (6) Rabin-Karp (6) Reverse (6) Scan from right (6) Schedule (6) Stream (6) Subset Sum (6) TSP (6) Xpost (6) n00tc0d3r (6) reddit (6) AI (5) Abbreviation (5) Anagram (5) Art Of Programming-July (5) Assumption (5) Bellman Ford (5) Big Data (5) Code - Solid (5) Code Kata (5) Codility-lessons (5) Coding (5) Company - WMware (5) Convex Hull (5) Crazyforcode (5) DFS - Multiple (5) DFS+DP (5) DP - Multi-Dimension (5) DP-Multiple Relation (5) Eulerian Cycle (5) Graph - Unusual (5) Graph Cycle (5) Hash Strategy (5) Immutability (5) Java (5) LogN (5) Manhattan Distance (5) Matrix Chain Multiplication (5) N Queens (5) Pre-Sort: Index (5) Quick Partition (5) Quora (5) Randomized Algorithms (5) Resources (5) Robot (5) SPFA(Shortest Path Faster Algorithm) (5) Shuffle (5) Sieve of Eratosthenes (5) Strongly Connected Components (5) Subarray Sum (5) Sudoku (5) Suffix Tree (5) Swap (5) Threaded (5) Tree - Creation (5) Warshall Floyd (5) Word Search (5) jiuzhang (5)

Popular Posts