东华复试OJ-43 丑数

作者: Turbo时间限制: 1S章节: 枚举

问题描述 :

对于一给定的素数集合 S = {p1, p2, …, pK}, 来考虑那些质因数全部属于S 的数的集合。

这个集合包括,p1, p1p2(即p1乘以p2), p1p3, 和 p1p2p3 (还有其它很多)。

这是个对于一个集合S的丑数集合。注意:我们不认为1 是一个丑数。

你的工作是对于输入的集合S去寻找集合中的第N个丑数。

说明:结果不超过32位整数能表示的范围

比如:S={2, 3, 5, 7}

则前15个丑数为:

2,3,4,5,6,7,8,9,10,12,14,15,16,18,20

输入说明 :

第 1 行: 2个被空格分开的整数:K 和 N , 1<= K<=100 , 1<= N<=100,000.

第 2 行: K 个被空格分开的整数,即集合S的元素

输出说明 :

单独的一行,即第N个丑数。

输入范例 :

4 15
2 3 5 7

输出范例 :

20

代码


```c
//算法思想:动态规划,是s[0]存放1,下一个数是已有丑数与质数数组中的乘积来确定,找出最小的进行填充。
//b[i]的值是a[i]质数应该乘的s[]上的位置,这个b[i]的值要动态变化,只要当前的a[i]*s[b[i]]不大于前一个丑数,那么必须让b[i]+1也就是取下一个丑数来比较  
#include
#include
#include

int main()
{
	int a[103],b[103];//
	int k,n,i;
	int
	long s[100001];
	scanf("%d %d",&k,&n);
	for(i=0;i<k;i++)
	{
		scanf("%d",&a[i]);
		b[i]=0;
	}
	s[0]=1;
	for(i=1;i<=n;i++)
	{
		s[i]=0x7fffffff;
		for(int j=0;j<k;j++)
		{
			while(a[j]*s[b[j]]<=s[i-1])
				b[j]++;
			if(a[j]*s[b[j]]<s[i])
				s[i]=a[j]*s[b[j]];
		}
	}
	printf("%ld\n",s[n]);
	return 0;

}

你可能感兴趣的:(东华复试)