丑数[弱弱版]

丑数[弱弱版]

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
****************************************************************/
posted @ 2019-12-22 11:30  牛大了的牛大  阅读(313)  评论(0编辑  收藏  举报