Cod sursa(job #646119)

Utilizator MciprianMMciprianM MciprianM Data 10 decembrie 2011 21:58:37
Problema NumMst Scor 24
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.01 kb
#include <fstream>
#include <vector>
#include <algorithm>

using namespace std;

vector <int> sol;
vector <int> primes;
vector <bool> u;
unsigned long long best [3500] [500];
unsigned short factor [3500] [500];

int XFactor (int n) {
	int x;
	for (x = 2; n % x != 0; ++ x);
	return x;
}

bool isPrime (int x) {
	for (int i = 1; primes [i] * primes [i] <= x; ++ i) {
		if (x % primes [i] == 0) {
			return false;
		}
	}
	return true;
}

void getPrimes () {
	int i;
	primes.push_back (1);
	primes.push_back(2);
	primes.push_back(3);
	primes.push_back(5);
	primes.push_back(7);
	for (i = 11; i * i <= 10000000; i += 2) {
		if (isPrime (i)) {
			primes.push_back (i);
		}
	}
	primes.push_back (666013);
}

void mark (int x) {
	int i, l = primes.size ();
	for (i = 0; i < primes.size (); ++ i) {
		u.push_back (x % primes [i] == 0);
	}
}

void makeSol (int x) {
	int i;
	bool ok = true;
	do {
		i = -1;
		while (primes [i + 1] <= x)	++ i;
		if (ok) {
			if (primes [i] == x) {
				-- i;
			}
			ok = false;
		}
		sol.push_back (factor [x] [i]);
		x = x - factor [x] [i];
	} while (x > 0);
}

int main () {
	int n, i, l, j;
	getPrimes ();
	ifstream f ("nummst.in");
	f >> n;
	f.close ();
	int x = XFactor (n), npx = n / x;
	mark (npx);
	l = primes.size ();
	for (j = 0; j < l; ++ j) {
		best [1] [j] = 1;
		best [2] [j] = 2;
	}
	best [2] [0] = 1;
	factor [2] [0] = 1;
	factor [1] [0] = 1;
	factor [2] [1] = 2;
	for (i = 3; i <= x; ++ i) {
		best [i] [0] = primes [0];
		factor [i] [0] = 1;
		for (j = 1; primes [j] <= i; ++ j) {
			if (! u [j] && best [i - primes [j]] [j - 1] * primes [j] > best [i] [j - 1]) {
				best [i] [j] = best [i - primes [j]] [j - 1] * primes [j];
				factor [i] [j] = primes [j];
			}
			else {
				best [i] [j] = best [i] [j - 1];
				factor [i] [j] = factor [i] [j - 1];
			}
		}
	}

	makeSol (x);
	ofstream g ("nummst.out");
	l = sol.size ();
	for (i = 0; i < l; ++ i) {
		g << npx * sol [i] << ' ';
	}
	g << '\n';
	return 0;
}