【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 }

 

你可能感兴趣的:(USACO)