USACO/Humble Numbers

USACO/Humble Numbers

Posted by dym on May 14, 2014

本文迁移自老博客,原始链接为 https://seven.blog.ustc.edu.cn/usacohumble-numbers/

寻找第n个丑数,丑数集合中每个数从小到大排列,每个丑数都是给定素数集合中的数的乘积,第N个“丑数”就是在能由素数集合中的数相乘得来的第n小的数。 解法:模拟,维护每一个素数所需乘的最小值

#include<iostream>
#include<algorithm>
#include<map>
#include<vector>
using namespace std;
ofstream fout ("humble.out");
ifstream fin ("humble.in");

int k,n,temp;
vector<int> prim;
vector<int> cosor;
vector<long long> vec;
map<long , long> ss;
long long a[100003];
int main()
{
	fin>>k>>n;
	for(int i = 0 ;i < k ;i++)
	{
		fin>>temp;
		prim.push_back(temp);
		cosor.push_back(1);
		vec.push_back(0);
	}
	a[1]=1;
	for(int i = 2;i <= n+1;)
	{
		int t;
		for(int j = 0 ; j < k ; j++)
		{
			vec[j] = a[cosor[j]] * prim[j];
		}
		long long Min = 9223372036854775807;
		t = 0;
		for(int j = 0; j < k ;j++)
		{
			if(vec[j] <  Min)
			{
				Min = vec[j];
				t = j;
			}		 
		}
		if(ss[Min])
		{
			cosor[t]++;
			continue;
		}
		ss[Min] = Min;
		a[i] = Min;
		cosor[t]++;
		i++;
	}
	fout<<a[n+1]<<endl;
	return 0;
}