Cod sursa(job #1759516)

Utilizator Cristian1997Vintur Cristian Cristian1997 Data 19 septembrie 2016 13:26:16
Problema NumMst Scor 45
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.56 kb
#include <fstream>
#include <iomanip>
#include <vector>
#include <algorithm>
#include <string>
#include <cstring>
#include <cmath>
using namespace std;
using ll = long long;
using uint = unsigned int;
using ull = unsigned long long;
using pii = pair<int, int>;
using pll = pair<ll, ll>;
#define VMAX 3200

vector<int> primes;
vector<bool> isPrime(VMAX, true);
double dp[VMAX][VMAX];
int fact[VMAX][VMAX];

void sieve(int);

int main()
{
	int i, j, n, s, p, prime, gcd;
	ifstream fin("nummst.in");
	ofstream fout("nummst.out");

	sieve(VMAX);

	fin >> n;

	for (i = 0; ; ++i) { if (n % primes[i] == 0) break; }
	s = primes[i];
	gcd = n / s;

	if (s < 5)
	{
		fout << gcd << ' ' << n - gcd << '\n';
		return 0;
	}

	for (j = 1; j <= s; ++j) dp[0][j] = 0.0; // log(1)

	for (i = 1; i <= (int)primes.size(); ++i)
	{
		prime = primes[i - 1];
		for (j = 1; j <= s; ++j)
		{
			dp[i][j] = dp[i - 1][j];
			fact[i][j] = 1;

			for (p = prime; p <= j; p *= prime)
			{
				if (dp[i][j] < dp[i - 1][j - p] + log(p))
					dp[i][j] = dp[i - 1][j - p] + log(p),
					fact[i][j] = p;
			}
		}
	}

	for (i = (int)primes.size(); i > 0; --i)
	{
		if (fact[i][s] > 1)
		{
			fout << gcd * fact[i][s] << ' ';
			s -= fact[i][s];
		}
	}

	for (; s; --s) fout << gcd << ' ';
	fout << '\n';

	fin.close();
	fout.close();

	return 0;
}

void sieve(int n)
{
	int i, j;

	primes.push_back(2);
	for (i = 3; i < n; i += 2)
		if (isPrime[i])
		{
			primes.push_back(i);
			for (j = i * i; j < n; j += i + i) isPrime[j] = false;
		}
}