usaco 3.1 Humble Numbers

给出K个素数,从这些数中取出任意个,每个数乘上任意遍,得到的这些数的集合叫做丑数,求集合中第N小的数。

一般的做法是,将这些素数放入优先队列,将队首元素弹出,将这个队首元素乘上每个素数的结果存入队列,从队列中pop出的第N个数就是第N小。

但这种做法在一些特殊输入下会导致队列内存爆掉。

另一种效率更高的的做法是:给每个素数设置一个计数器,计数器中的值表示它和已知的前i小个丑数已经乘

/*
ID: modengd1
PROG: humble
LANG: C++
*/
#include <iostream>
#include <stdio.h>
#include <memory.h>
using namespace std;
int prim[100];
int counter[100];
int d[100001];
int main()
{
    freopen("humble.in","r",stdin);
    freopen("humble.out","w",stdout);
    int K,N;
    scanf("%d%d",&K,&N);
    for(int i=0;i<K;i++)
        scanf("%d",&prim[i]);
    d[0]=1;
    memset(counter,0,sizeof(counter));
    for(int i=1;i<=N;i++)
    {
        int temp=0x7fffffff;
        for(int j=0;j<K;j++)
        {
            while(prim[j]*d[counter[j]]<=d[i-1])
                counter[j]++;
            if(prim[j]*d[counter[j]]<temp)
            {
                temp=prim[j]*d[counter[j]];
            }
        }
        d[i]=temp;
    }
    cout<<d[N]<<endl;
    return 0;
}

  

过了。

每次生成一个丑数之后,找到一个最小的比这个丑数最大的,前面的丑数乘给定素数的积。这个最小的积就是下一小的丑数,这样生成N个丑数,就得到了解。

时间: 2024-11-03 22:11:26

usaco 3.1 Humble Numbers的相关文章

洛谷P2723 丑数 Humble Numbers [2017年 6月计划 数论07]

P2723 丑数 Humble Numbers 题目背景 对于一给定的素数集合 S = {p1, p2, ..., pK},考虑一个正整数集合,该集合中任一元素的质因数全部属于S.这个正整数集合包括,p1.p1*p2.p1*p1.p1*p2*p3...(还有其 它).该集合被称为S集合的“丑数集合”.注意:我们认为1不是一个丑数. 题目描述 你的工作是对于输入的集合S去寻找“丑数集合”中的第N个“丑数”.所有答案可以用longint(32位整数)存储. 补充:丑数集合中每个数从小到大排列,每个丑

洛谷P2723 丑数 Humble Numbers

P2723 丑数 Humble Numbers 52通过 138提交 题目提供者该用户不存在 标签USACO 难度普及/提高- 提交  讨论  题解 最新讨论 暂时没有讨论 题目背景 对于一给定的素数集合 S = {p1, p2, ..., pK},考虑一个正整数集合,该集合中任一元素的质因数全部属于S.这个正整数集合包括,p1.p1*p2.p1*p1.p1*p2*p3...(还有其它).该集合被称为S集合的“丑数集合”.注意:我们认为1不是一个丑数. 题目描述 你的工作是对于输入的集合S去寻找

Humble Numbers(丑数) 超详解!

给定一个素数集合 S = { p[1],p[2],...,p[k] },大于 1 且素因子都属于 S 的数我们成为丑数(Humble Numbers or Ugly Numbers),记第 n 大的丑数为 h[n]. 算法 1: 一种最容易想到的方法当然就是从 2 开始一个一个的判断一个数是否为丑数.这种方法的复杂度约为 O( k * h[n]),铁定超时(如果你这样做而没有超时,请跟 tenshi 联系) 算法 2: 看来只有一个一个地主动生成丑数了 : 我最早做这题的时候,用的是一种比较烂的

poj 2247 Humble Numbers

Humble Numbers Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 9453   Accepted: 4440 题目大意:找出所有因子中只有2,3,5,7的数,给出n,求出第n个这样   只有6000不到打表 注意第11  12  13 的输出与 1   2   3    几十一   几十二   几十三 的输出不同 #include <iostream> #include <algorithm> u

Humble Numbers HDU - 1058

A number whose only prime factors are 2,3,5 or 7 is called a humble number. The sequence 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 14, 15, 16, 18, 20, 21, 24, 25, 27, ... shows the first 20 humble numbers. Write a program to find and print the nth element i

Humble Numbers

Humble Numbers For a given set of K prime numbers S = {p1, p2, ..., pK}, consider the set of all numbers whose prime factors are a subset of S. This set contains, for example, p1, p1p2, p1p1, and p1p2p3 (among others). This is the set of `humble numb

(hdu step 3.2.5)Humble Numbers(从小到大输出因子只有2,3,,5,7的数)

题目: Humble Numbers Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 913 Accepted Submission(s): 492   Problem Description A number whose only prime factors are 2,3,5 or 7 is called a humble number.

hdu 1058 Humble Numbers

Humble Numbers Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 18406    Accepted Submission(s): 8010 Problem Description A number whose only prime factors are 2,3,5 or 7 is called a humble numbe

HDU 1058 Humble Numbers(dp)

Problem Description A number whose only prime factors are 2,3,5 or 7 is called a humble number. The sequence 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 14, 15, 16, 18, 20, 21, 24, 25, 27, ... shows the first 20 humble numbers. Write a program to find and pri