P2723 丑数 Humble Numbers

题意:给你k个质数,定义丑数集合为k个质数随机(1--k)个相乘得到的数

   求第n小的丑数

暴力。。。貌似不太可行,(把所有大量丑数求出来,sort   QAQ)

可以想到,对于第i个丑数f[i],它一定是由之前的某个丑数*a[i]得到的

所以枚举之前已求出的丑数和a[i]相乘若>f[i-1] 则与ans取min

这些大于f[i-1]的所有值的min就是f[i]!(f[i]是大于f[i-1]的第一个数)

#include<cstdio>
#include<iostream>
#include<cstring>
#include<cctype>
#include<algorithm>
using namespace std;
#define int long long
#define olinr return
#define _ 0
#define love_nmr 0
#define DB double
inline int read()
{
    int x=0,f=1;
    char ch=getchar();
    while(!isdigit(ch))
    {
        if(ch==‘-‘)
            f=-f;
        ch=getchar();
    }
    while(isdigit(ch))
    {
        x=(x<<1)+(x<<3)+(ch^48);
        ch=getchar();
    }
    return x*f;
}
inline void put(int x)
{
    if(x<0)
    {
        x=-x;
        putchar(‘-‘);
    }
    if(x>9)
        put(x/10);
    putchar(x%10+‘0‘);
}
int n;
int k;
int a[350];
int f[105050];
int s[350];
signed main()
{
    k=read();
    n=read();
    f[0]=1;
    for(int i=1;i<=k;i++)
        a[i]=read();
    for(int i=1;i<=n;i++)
    {
        int ans=0x7fffffff;
        for(int j=1;j<=k;j++)
        {
            int l=0,r=i-1;
            int t=0;
            while(l<=r)
            {
                int mid=(l+r)>>1;
                if(a[j]*f[mid]<=f[i-1])
                {
                    l=mid+1;
                }
                else
                {
                    r=mid-1;
                    t=mid;
                }
            }
            ans=min(ans,f[t]*a[j]);
        }
        f[i]=ans;
    }
    put(f[n]);
    olinr ~~(0^_^0)+love_nmr;
}

原文地址:https://www.cnblogs.com/olinr/p/9578718.html

时间: 2024-10-12 03:04:10

P2723 丑数 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去寻找

Luogu P2723 丑数 Humble Numbers

太巧妙了,想了好久都没想出来,居然只是道黄题... 用s[j]储存每个数的下界,以大大减少枚举次数:从较小的数据入手,分析解题思路,优化枚举顺序从而优化复杂度. 1 #include<iostream> 2 #include<climits> 3 4 using namespace std; 5 6 const int Maxn = 1e5+10; 7 int f[Maxn] = {1},p[110],s[110]; 8 int n,k,m; 9 10 int main(){ 11

Luogu2723丑数Humble Numbers

这是一道经典的归并排序题,100路归并,思路很简单,寻找最小值加入答案队列,然后把所有最小值的指针都前移(可能有重复的),直到答案队列的长度达到n,输出即可. 话说好像还有用堆的,我打了一个,结果最后一个点T了,估计是哈希函数没选好,开O3都没有(代码附下). 1 ///一百路归并 2 #include<cstdio> 3 #include<iostream> 4 using namespace std; 5 long long d[105],q[100001]; 6 int p[

C语言程序设计100例之(14):丑数

例14   丑数 问题描述 丑数是其质因子只可能是2,3或5的数.前10个丑数分别为1, 2, 3, 4, 5, 6, 8, 9, 10, 12.输入一个正整数n,求第n个丑数. 输入格式 每行为一个正整数n (n <= 1500),输入n=0结束. 输出格式 每行输出一个整数,表示求得的第n个丑数. 输入样例 1 2 50 0 输出样例 1 2 243 (1)编程思路. 根据丑数的定义,丑数从小到大排列的序列中的一个数应该是其前面某个数乘以2.3或者5的结果.因此,可以定义一个数组num[15

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: 看来只有一个一个地主动生成丑数了 : 我最早做这题的时候,用的是一种比较烂的

DP:Humble Numbers,丑数

描述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 elemen

hdu1058 Humble Numbers(丑数)

丑数:只包含一定的质因子的数称丑数,例如包含2,3,5.我们就把2,3,4,5,6,8,9,10,12,15........但我们通常把1称作为第一个丑数. 解题思路:我们现在做的这道题,就是以2,3,5,7为质因子,要我们求第n个丑数(以1为第一个丑数),可以采用DP的思想来解决.我们先以array[1]=1为基础,在它乘以质因子取得最小的数为有序数组的第二个,然后依次类推.写出状态转移方程:array[n] = Min(array[n2]*2, array[n3]*3, array[n5]*

HDU 丑数 - 1058 Humble Numbers

这一题是讲了一个名叫丑数的概念(为啥叫丑数,,). 概念:因子中仅仅包含2.3.5,7的数,称为丑数.但其实我百度网上时,发现正常的丑数应该是因子中仅仅包含2.3.5,不过基本都一样. 我们可以通过不断mod2,3,5,7,直到无法在摸,验证此时是否为1来判断该数是否为丑数,但是这样的方法太过浪费时间,所以介绍一种新的方法,下面方法摘自这里点击打开链接. 根据丑数的定义,丑数应该是另一个丑数乘以2.3,5或者7的结果(1除外).因此我们可以创建一个数组,里面的数字是排好序的丑数.里面的每一个丑数