• 丑数[弱弱版]


    丑数[弱弱版]

    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
    ****************************************************************/
    
  • 相关阅读:
    CF453A
    各种算法的复杂度
    状压dp--P2622 关灯问题II
    笛卡尔树模板
    20201122模拟
    nm树上背包+二分--P4322 [JSOI2016]最佳团体
    20201121模拟
    20201119模拟
    斜率优化--P3195 [HNOI2008]玩具装箱
    网络流--最大流,最小割,费用流问题
  • 原文地址:https://www.cnblogs.com/LJA001162/p/12079323.html
Copyright © 2020-2023  润新知