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