Cod sursa(job #646111)

Utilizator MciprianMMciprianM MciprianM Data 10 decembrie 2011 21:13:12
Problema NumMst Scor 24
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.98 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];
bool 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 j;
	do {
		int maxL = 0;
		for (j = 1; primes [j] <= x; ++ j) {
			if (best [x] [j] > best [x] [maxL]) {
				maxL = j;
			}
		}
		while (maxL >= 0 && ! factor [x] [maxL]) {
			maxL --;
		}
		if (maxL >= 0) {
			sol.push_back (primes [maxL]);
		}
		else {
			//error?
		}
		x = x - primes [maxL];
	} 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] = 1;
	}
	factor [1] [0] = true;
	factor [2] [0] = true;
	for (i = 3; i <= x; ++ i) {
		best [i] [0] = primes [0];
		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] = true;
			}
			else {
				best [i] [j] = best [i] [j - 1];
			}
		}
	}

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