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%。。。
当时为什么就想不出来呢。。