【USACO 3.1.3】丑数

【描述】

对于一给定的素数集合 S = {p1, p2, ..., pK}, 
来考虑那些质因数全部属于S 的数的集合。这个集合包括,p1, p1p2, p1p1, 和 p1p2p3 (还有其它)。这是个对于一个输入的S的丑数集合。
注意:我们不认为1 是一个丑数。
你的工作是对于输入的集合S去寻找集合中的第N个丑数。longint(signed 32-bit)对于程序是足够的。
 

【格式】

PROGRAM NAME: humble
INPUT FORMAT:(file humble.in)
 
第 1 行: 二个被空间分开的整数:K 和 N , 1<= K<=100 , 1<= N<=100,000.
第 2 行:  K 个被空间分开的整数:集合S的元素
 
OUTPUT FORMAT:(file humble.out)

单独的一行,写上对于输入的S的第N个丑数。

【分析】

不说什么了,原题,直接上代码。

 1 #include <cstdlib>
 2 #include <iostream>
 3 #include <cstdio>
 4 #include <cstring>
 5 #include <cmath>
 6 #include <algorithm>
 7 typedef long long ll;
 8 const ll maxn=100000+10;
 9 const ll maxk=105;
10 using namespace std;
11 ll S[maxk],N[maxn],low[maxn];
12 //low用来加速 
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 }

 

posted @ 2014-06-22 21:28  TCtower  阅读(362)  评论(0编辑  收藏  举报