Cod sursa(job #585908)

Utilizator ProtomanAndrei Purice Protoman Data 30 aprilie 2011 12:37:28
Problema NumMst Scor 100
Compilator cpp Status done
Runda Algoritmiada 2011, Runda Finală, Clasele 10-12 Marime 1.49 kb
#include <algorithm>
#include <stdio.h>
#include <math.h>
#include <vector>

#define pb push_back
#define eps 0.00001
#define MAX 4096

using namespace std;

int n, diviz;
int sel[MAX];
double sol[570][MAX];
vector <int> vctPrime, vctNr;
int main()
{
	freopen("nummst.in", "r", stdin);
	freopen("nummst.out", "w", stdout);

	scanf("%d", &n);

	for (int i = 2; i * i <= n; i++)
		if (n % i == 0)
		{
			diviz = n / i;
			n = i;
		}

	if (n < 5)
		n--, vctNr.pb(1);
	
	vctPrime.pb(0);
	for (int i = 2; i <= n; i++)
		if (!sel[i])
		{
			for (int j = i * i; j <= n; j += i)
				sel[j] = 1;
			vctPrime.pb(i);
		}

	for (int i = 1; i < vctPrime.size(); i++)
	{
		for (int j = 1; j <= n; j++)
		{
			sol[i][j] = sol[i - 1][j];

			int ad = vctPrime[i];
			for (; ad <= j; ad *= vctPrime[i])
				sol[i][j] = max(sol[i][j], sol[i - 1][j - ad] + log((double) ad));
		}
	}

	int act = vctPrime.size() - 1, pus = n;
	double sf = sol[act][n];
	for (; act; act--)
	{
		if (fabs(sol[act][pus] - sol[act - 1][pus]) <= eps)
			continue;
		else
		{
			int ad = vctPrime[act];
			for (; ad <= pus; ad *= vctPrime[act])
				if (fabs(sol[act][pus] - sol[act - 1][pus - ad] - log((double) ad)) <= eps)
				{
					pus -= ad;
					vctNr.pb(ad);

					break;
				}
		}
	}

	for (; pus; pus--)
		vctNr.pb(1);

	sort(vctNr.begin(), vctNr.end());

	for (int i = 0; i < vctNr.size(); i++)
		printf("%d ", vctNr[i] * diviz);

	fclose(stdin);
	fclose(stdout);
	return 0;
}