• 【USACO 3.1.3】丑数


    【描述】

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

    【格式】

    PROGRAM NAME: humble
    INPUT FORMAT:(file humble.in)
     
    第 1 行: 二个被空间分开的整数:K 和 N , 1<= K<=100 , 1<= N<=100,000.
    第 2 行:  K 个被空间分开的整数:集合S的元素
     
    OUTPUT FORMAT:(file humble.out)

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

    【分析】

    不说什么了,原题,直接上代码。

     1 #include <cstdlib>
     2 #include <iostream>
     3 #include <cstdio>
     4 #include <cstring>
     5 #include <cmath>
     6 #include <algorithm>
     7 typedef long long ll;
     8 const ll maxn=100000+10;
     9 const ll maxk=105;
    10 using namespace std;
    11 ll S[maxk],N[maxn],low[maxn];
    12 //low用来加速 
    13 int main()
    14 {
    15     ll k,n,i,j,l,minp=0;
    16     //文件操作
    17     freopen("humble.in","r",stdin);
    18     freopen("humble.out","w",stdout);
    19     memset(low,0,sizeof(low));
    20     scanf("%lld%lld",&k,&n);
    21     for (i=1;i<=k;i++) scanf("%lld",&S[i]);
    22     sort(S+1,S+1+k);//排序 
    23     N[0]=1;//初始化 
    24     for (i=1;i<=n;i++)//求第I个丑数 
    25     {
    26         ll temp=0x7fffffff;
    27         for (j=1;j<=k;j++)
    28         {
    29             while (S[j]*N[low[j]]<=N[i-1]) low[j]++;
    30             if (S[j]*N[low[j]]<temp)
    31             {
    32                 temp=S[j]*N[low[j]];
    33                 minp=j;
    34             }
    35         }
    36         N[i]=temp;
    37         low[minp]++;
    38     }
    39     printf("%lld",N[n]);
    40     return 0;
    41 }
  • 相关阅读:
    2018牛客网暑期ACM多校训练营(第九场)A -Circulant Matrix(FWT)
    ZOJ
    BZOJ 4318 OSU!(概率DP)
    POJ
    POJ
    Linux安装及管理程序
    Linux目录及文件管理
    linux账号管理操作
    linux系统命令总结
    linux目录及文件管理操作
  • 原文地址:https://www.cnblogs.com/hoskey/p/3803083.html
Copyright © 2020-2023  润新知