质数生成集

质数生成集

求第 k k k个丑数。

丑数 N N N的质因数只有 2 , 3 , 5 2,3,5 2,3,5

我们知道任何一个丑数 N N N,都是小于 N N N的某一个丑数乘以 2 , 3 , 5 2,3,5 2,3,5生成的。因此,我们得到三个有序序列:

1 ∗ 2 , 2 ∗ 2 , 3 ∗ 2 , 4 ∗ 2 , 5 ∗ 2 , … 1 ∗ 3 , 2 ∗ 3 , 3 ∗ 3 , 4 ∗ 3 , 5 ∗ 3 , … 1 ∗ 5 , 2 ∗ 5 , 3 ∗ 5 , 4 ∗ 5 , 5 ∗ 5 , … 1*2,2*2,3*2,4*2,5*2,\ldots \\ 1*3,2*3,3*3,4*3,5*3,\ldots \\ 1*5,2*5,3*5,4*5,5*5,\ldots \\ 12,22,32,42,52,13,23,33,43,53,15,25,35,45,55,

本问题就相当于从一个合并三个虚构的有序序列即可。

设置三个指针 p 2 , p 3 , p 5 p2,p3,p5 p2,p3,p5分别指向各自序列的下标,依次取数即可。

UVA136

#include <bits/stdc++.h>

using namespace std;

#define FR freopen("in.txt", "r", stdin)
#define FW freopen("out.txt", "w", stdout)

#define MAXT INT_MAX

typedef long long ll;

int dp[1600];

int main()
{
    dp[1] = 1;
    int p2 = 1;
    int p3 = 1;
    int p5 = 1;

    for(int i = 2;i <= 1500;i++)
    {
        int val = min({dp[p2] * 2,dp[p3] * 3,dp[p5] * 5});

        dp[i] = val;

        if(val == dp[p2] * 2) p2++;
        if(val == dp[p3] * 3) p3++;
        if(val == dp[p5] * 5) p5++;
    }

    printf("The 1500'th ugly number is %d.",dp[1500]);
    return 0;
}

此方法可以推广至任意素因子。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值