丑数[弱弱版]
丑数[弱弱版]
Description
对于一给定的素数集合 S = {p1, p2, ..., pK}, 来考虑那些质因数全部属于S 的数的集合。 这个集合包括:p1, p1p2, p1p1, 和 p1p2p3 (还有其它)。这是个对于一个输入的S的丑数集 合。注意:我们不认为1 是一个丑数。 你的工作是对于输入的集合S去寻找集合中的第N个丑数。longint(signed 32-bit)对于 程序是足够的。
Input
第 1 行: 二个被空隔分开的整数:K 和 N , 1<= K<=100 , 1<= N<=100,000. 第 2 行: K 个被空隔分开的整数:集合S的元素
Output
单独的一行,写上对于输入的S的第N个丑数。
Sample Input
4 19
2 3 5 7
Sample Output
27
HINT
Source
#include<bits/stdc++.h>
using namespace std;
int len=0;
long long s[300001];
void s_up(int p)
{
while(p>1&&s[p/2]>s[p])
{
swap(s[p/2],s[p]);
p=p/2;
}
return;
}
void s_down(int p)
{
int lt;
while(1)
{
if(p*2>len) return;
if(p*2==len) lt=p*2;
else
{
if(s[p*2]<s[p*2+1])
lt=p*2;
else
lt=p*2+1;
}
if(s[p]>s[lt])
{
swap(s[p],s[lt]);
p=lt;
}
else break;
}
return;
}
void insert(long long key)
{
len++;
s[len]=key;
s_up(len);
}
int main()
{
int n,k;
cin>>k>>n;
int a[101];
for(int i=1;i<=k;i++) scanf("%d",&a[i]);
sort(a+1,a+1+k);
insert(a[1]);
long long t=-1;
for(int i=1;i<=n;i++)
{
while(t==s[1])
{
s[1]=s[len--];
s_down(1);
}
t=s[1];
s[1]=s[len--];
s_down(1);
long long v;
insert(t*a[1]);
for(int j=1;j<=k;j++)
if(t%a[j]==0)
{
if(j!=k)
{
v=t/a[j]*a[j+1];
insert(v);
break;
}
}
}
cout<<t<<endl;
return 0;
}
/**************************************************************
Problem: 1498
User: LJA001162
Language: C++
Result: 正确
Time:40 ms
Memory:3884 kb
****************************************************************/