题意:给你一个由n(1-100)素数组成的集合,问你第m(1-100000)大个所有质因子都来自于这个集合的合数是多少。。
解题思路:两种思路:1)bfs + 优先队列。 2) 直接枚举(已知第k大,找k+1大的数只需要找 质数乘前k个数的最小值,这里不用每次都乘,只需要维持一个 每个质数的现在乘到多少的数组即可)
解题代码:
1 // File Name: humble.c 2 // Author: darkdream 3 // Created Time: 2014年01月14日 星期二 15时51分00秒 4 /* 5 ID: dream.y1 6 PROG: humble 7 LANG: C++ 8 */ 9 #include<stdio.h> 10 #include<string.h> 11 #include<stdlib.h> 12 #include<time.h> 13 #include<math.h> 14 long long num[100005]; 15 int hs[104]; 16 int a[104]; 17 int main(){ 18 freopen("humble.in","r",stdin); 19 freopen("humble.out","w",stdout); 20 int n ,m; 21 scanf("%d %d",&n,&m); 22 for(int i =1;i <= n;i ++) 23 scanf("%d",&a[i]); 24 num[0] = 1; 25 for(int i =1;i <= m;i ++) 26 { 27 long long min = num[i-1] * a[1]; 28 for(int j =1; j <= n;j ++) 29 { 30 31 while(1ll* a[j] * num[hs[j]] <= 1ll*num[i-1]) 32 { 33 hs[j] = hs[j] + 1; 34 } 35 if(a[j] * num[hs[j]] <= min ) 36 min = a[j] * num[hs[j]]; 37 } 38 num[i] = min; 39 } 40 printf("%lld ",num[m]); 41 return 0 ; 42 }