Pagini recente » Cod sursa (job #770736) | Cod sursa (job #2165058) | Cod sursa (job #1039318) | Cod sursa (job #2634671) | Cod sursa (job #646119)
Cod sursa(job #646119)
#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;
}