USACO--3.1Humble Numbers

这个题的难点在于如何顺序的产生Humble Numbers。考虑我们已经得到前k个Humble Numbers,如果得到第k+1个Humble Numbers?对每个素数,在前k个Humble Numbers中选择一个数与其相乘的结果恰好大于第k个Humble Numbers,然后我们的第k+1个数就是这些结果中的最小值。当然如果对每个素数每次都要遍历一遍前k个Humble Numbers,肯定会超时,但是我们注意到其实我们只要从上一次遍历的地方开始进行本次的遍历就行了,所以可以用一个数组记录每个素数遍历的起始位置。

代码如下:

/*
ID:15674811
LANG:C++
PROG:humble
*/

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;

#define INF 0x7fffffff  ///INF不要定义的太小
int ans[110000];
int cnt[110];

int main()
{
    freopen("humble.in","r",stdin);
    freopen("humble.out","w",stdout);
    ///freopen("lkl.txt","r",stdin);
    int n,m,a[110];
    while(scanf("%d%d",&n,&m)!=EOF)
    {
         for(int i=0;i<n;i++)
            scanf("%d",&a[i]);
         ans[1]=1;
         for(int i=0;i<n;i++)
            cnt[i]=1;
         for(int i=2;i<=m+1;i++)
         {
             int Min=INF;
             for(int j=0;j<n;j++)
             {
                 while(a[j]*ans[cnt[j]]<=ans[i-1])
                     cnt[j]++;
                 if(a[j]*ans[cnt[j]]>ans[i-1]&&a[j]*ans[cnt[j]]<Min)
                     Min=a[j]*ans[cnt[j]];
             }
             ans[i]=Min;
         }
         printf("%d\n",ans[m+1]);
    }
  return 0;
}
时间: 2024-10-03 13:10:08

USACO--3.1Humble Numbers的相关文章

USACO3.1Humble Numbers[...]

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

USACO Section 2.2 Runaround Numbers

/* ID: lucien23 PROG: runround LANG: C++ */ #include <iostream> #include <fstream> #include <cstring> using namespace std; int main() { ifstream infile("runround.in"); ofstream outfile("runround.out"); if(!infile || !

usaco 3.1 Humble Numbers

给出K个素数,从这些数中取出任意个,每个数乘上任意遍,得到的这些数的集合叫做丑数,求集合中第N小的数. 一般的做法是,将这些素数放入优先队列,将队首元素弹出,将这个队首元素乘上每个素数的结果存入队列,从队列中pop出的第N个数就是第N小. 但这种做法在一些特殊输入下会导致队列内存爆掉. 另一种效率更高的的做法是:给每个素数设置一个计数器,计数器中的值表示它和已知的前i小个丑数已经乘 /* ID: modengd1 PROG: humble LANG: C++ */ #include <iostr

usaco Runaround Numbers

题意为一个数从最左边开始,往右数这个位上的个数个,然后这样走一圈,回到起点,每个数字都访问过且只访问一次,这个数字就是循环数 要求找出第一个比N大的循环数 /* ID: modengd1 PROG: runround LANG: C++ */ #include <iostream> #include <math.h> #include <stdio.h> #include <memory.h> using namespace std; bool isarro

USACO Section2.2 Runaround Numbers 解题报告 【icedream61】

runround解题报告------------------------------------------------------------------------------------------------------------------------------------------------[题目] 给你一个数M,找出第一个比它大的循环数. 循环数:不包括0.没有重复数字,并且有循环性质的正整数. 循环性质:以81362为例 1.找到最高位,是8,那么往下数8位,依次是1,3

USACO Runaround Numbers 模拟

根据题意的 Runaround 规则去找比当前数大的最近的一个 Runaround数字 模拟题~ Source code: /* ID: wushuai2 PROG: runround LANG: C++ */ //#pragma comment(linker, "/STACK:16777216") //for c++ Compiler #include <stdio.h> #include <iostream> #include <fstream>

【USACO 2.2】Runaround Numbers

找出第一个大于n的数满足:每一位上的数都不同,且没有0,第一位开始每次前进当前这位上的数那么多位,超过总位数就回到开头继续往前进,最后能不能每个位都到过一次且回到第一位,$n<10^9$. 暴力,每次n++后模拟一边判断是否符合条件. /* TASK:runround LANG:C++ */ #include<cstdio> #include<cstring> using namespace std; int n; int get(int now,int step,int l

USACO Humble Numbers

这道题的意思是给你一个素数的集合, 定义丑数为集合中的数相乘, 问你第N个丑数是多少?假设我们现在已经得到了n个丑数, 要寻找地n+1个丑数的话就用当前的素数乘以之前得到的丑数之后找出大于最后一个丑数的最小值即可,代码如下: /* ID: m1500293 LANG: C++ PROG: humble */ #include <cstdio> #include <cstring> #include <algorithm> #include <queue> s

洛谷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位整数)存储. 补充:丑数集合中每个数从小到大排列,每个丑