USACO SECTION 3.1 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 numbers' for the input set S. Note: The number 1 is explicitly declared not to be a humble number.

Your job is to find the Nth humble number for a given set S. Long integers (signed 32-bit) will be adequate for all solutions.

PROGRAM NAME: humble

INPUT FORMAT

Line 1:Two space separated integers: K and N, 1 <= K <=100 and 1 <= N <= 100,000.
Line 2:K space separated positive integers that comprise the set S.

SAMPLE INPUT (file humble.in)

4 19
2 3 5 7

OUTPUT FORMAT

The Nth humble number from set S printed alone on a line.

SAMPLE OUTPUT (file humble.out)

27
/*
ID: conicoc1
LANG: C
TASK: humble
*/
#include<stdio.h>
#include<string.h>
#include<stdlib.h>

int K,Set[100];
int Nth;
int Count[100];
long long  int Min;
long long   int Humble[100001];
int HumbleNumber=1;

int main()
{
	FILE *fin,*fout;
	fin=fopen("humble.in","r");
	fout=fopen("humble.out","w");
	memset(Count,0,sizeof(Count));
	fscanf(fin,"%d %d",&K,&Nth);
	int i,j,temp;
	for(i=0;i<K;i++)
		fscanf(fin,"%d",&Set[i]);	
	
	Humble[0]=1;
	while(HumbleNumber!=Nth+1)
	{
		Min=Set[K-1]*Humble[HumbleNumber-1]+1;
		for(i=0;i<K;i++){
			if(Set[i]*Humble[Count[i]]==Humble[HumbleNumber-1])
				Count[i]++;
			if(Set[i]*Humble[Count[i]]<Min){
				Min=Set[i]*Humble[Count[i]];
				temp=i;
			}
		}
		Humble[HumbleNumber++]=Min;
		Count[temp]++;
	}
	
	fprintf(fout,"%ld\n",Humble[Nth]);
	return 0;
}


以为是DP,想了半天想不出,就是不知道怎么按照大小顺序寻找丑数

看了NOCOW上的官方分析之后写的。。代码相似度居然有90%。。。

当时为什么就想不出来呢。。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值