丑数[数据加强版]

丑数[数据加强版]

Description

对于一给定的素数集合 S = {p1, p2, ..., pK}, 来考虑那些质因数全部属于S 的数的集合。 这个集合包括:p1, p1p2, p1p1, 和 p1p2p3 (还有其它)。这是个对于一个输入的S的丑数集 合。注意:我们不认为1 是一个丑数。 你的工作是对于输入的集合S去寻找集合中的第N个丑数。long long对于 程序是足够的。

Input

第 1 行: 二个被空隔分开的整数:K 和 N , 1<= K<=100 , 1<= N<=3,000,000. 第 2 行: K 个被空隔分开的整数:集合S的元素

Output

单独的一行,写上对于输入的S的第N个丑数。

Sample Input

4 19
2 3 5 7

Sample Output

27

HINT

Source

//
//  f.cpp
//  noip
//
//  Created by lijian3256 on 2020/1/11.
//  Copyright © 2020 lijian3256. All rights reserved.
//
 
#include<bits/stdc++.h>
using namespace std;
  
const int maxcount = 3000001;
long long r[maxcount];
  
int heap[101];
int heapsize = 0;
  
void put(int n)
{
    heap[heapsize + 1] = n;
    heapsize ++;
    int now = heapsize;
    while(now > 1)
    {
        int parent = now >> 1;
        if(heap[parent] <= heap[now])
        {
            return;
        }
        else
        {
            swap(heap[parent], heap[now]);
            now = parent;
        }
    }
}
  
int get()
{
    if(heapsize < 1)
        {
            cout << "error";
            return -1;
        }
    int r = heap[1];
      
    heap[1] = heap[heapsize];
    heapsize--;
    int now = 1;
      
    while(now*2 <= heapsize)
    {
        int son1 = now * 2;
        int son2 = son1 + 1;
        int smallerson = son1;
        if(son2 <= heapsize)
        {
            if(heap[son1] > heap[son2])
            {
                smallerson = son2;
            }
            else
                smallerson = son1;
        }
          
        if(heap[smallerson] < heap[now])
        {
            swap(heap[smallerson], heap[now]);
            now = smallerson;
        }
        else
        {
            return r;
        }
    }
    return r;
}
  
  
struct T
{
    long long n;
    int i;
    int j;
};
T  heap2[101];
int heapsize2 = 0;
  
int find(long long n, int start, int end)
{
    if (start == end)
    {
        if(heap2[start].n == n)
            return -1;
        else if(heap2[start].n > n)
            return start+1;
        else
            return start;
    }
    int m = (start + end) / 2;
    if(heap2[m].n == n)
        return -1;
    else if(heap2[m].n > n)
    {
        if(m + 1 > end)
            return m+1;
        else
            return find(n, m + 1, end);
    }
    else
    {
        if(start > m-1)
            return start;
        else
            return find(n, start, m - 1);
    }
}
  
bool put2(long long n, int i, int j)
{
    int k;
    if(heapsize2 < 1)
        k = 1;
    else
        k = find(n, 1, heapsize2);
    if ( k == -1)
        return false;
    else
    {
        T node;
        node.n = n;
        node.i = i;
        node.j = j;
        for(int c=heapsize2;c>=k;c--)
            heap2[c+1] = heap2[c];
        heap2[k] = node;
        heapsize2++;
        return true;
    }
}
  
  
  
T get2()
{
    return heap2[heapsize2--];
      
}
  
int main()
{
    int P[101];
    int K, N;
    int temp;
    cin >> K >> N;
    for(int i=1;i<=K;i++)
    {
        cin >> temp;
        put(temp);
    }
      
    for(int i=1;i<=K;i++)
        P[i] = get();
      
      
    for(int i=1;i<=K;i++)
    {
        put2(P[i], P[i], 0);
    }
      
  
    int nn = 0;
  
    while(nn <= N)
    {
        T t = get2();
        if(t.n > r[nn])
        {
            r[++nn] = t.n;
        }
          
        int j = t.j + 1;
        while(! put2(t.i * r[j], t.i, j))
        {
            j++;
        }
    }
      
    cout << r[N];
    //cout << pp << " " << r[N] << " " << N;
    return 0;
}
 
/**************************************************************
    Problem: 1499
    User: LJA001162
    Language: C++
    Result: 正确
    Time:1568 ms
    Memory:24980 kb
****************************************************************/
posted @ 2019-12-22 11:33  牛大了的牛大  阅读(349)  评论(0编辑  收藏  举报