Pagini recente » Cod sursa (job #2878025) | Cod sursa (job #3163217) | Cod sursa (job #953201) | Cod sursa (job #562090) | Cod sursa (job #585865)
Cod sursa(job #585865)
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <set>
using namespace std;
const int MAX = 3505;
int n, cmmdc, nrt, nrp, pr[MAX], last[MAX];
double prod[MAX];
set <int> next[MAX];
void init() {
int i = 2;
for (i = 2; i <= n; ++ i)
if (n % i == 0)
break;
cmmdc = n / i;
nrt = i;
if (nrt == 2) {
printf("%d %d\n", cmmdc, cmmdc);
exit(0);
}
if (nrt == 3) {
printf("%d %d\n", cmmdc, 2 * cmmdc);
exit(0);
}
}
void ciur() {
bool f[MAX];
for (int i = 0; i < MAX; ++ i)
f[i] = 0;
for (int i = 2; i < MAX; ++ i)
if (!f[i]) {
pr[++ nrp] = i;
for (int j = i * i; j < MAX; j += i)
f[j] = 1;
}
}
void solve() {
bool r[MAX];
for (int i = 0; i < MAX; ++ i)
r[i] = 0;
r[0] = 1;
prod[0] = 0;
last[0] = - 1;
double lp;
for (int i = 1; i <= nrp; ++ i) {
if (pr[i] > nrt)
break;
for (int j = nrt; j >= 0; -- j)
if (r[j] && j + pr[i] <= nrt) {
r[j + pr[i]] = 1;
if (prod[j] + log(pr[i]) > prod[j + pr[i]]) {
if (prod[j + pr[i]] != 0)
next[last[j + pr[i]]].erase(*next[last[j + pr[i]]].find(j + pr[i]));
lp = prod[j + pr[i]];
prod[j + pr[i]] = prod[j] + log(pr[i]);
for (set <int> :: iterator it = next[j + pr[i]].begin(); it != next[j + pr[i]].end(); ++ it)
prod[*it] = prod[*it] - lp + prod[j + pr[i]];
next[j].insert(j + pr[i]);
last[j + pr[i]] = j;
}
}
}
}
void reconst(int poz) {
if(poz == 0)
return ;
printf("%d ", (poz - last[poz]) * cmmdc);
reconst(last[poz]);
}
void afis() {
double mc = - 1;
int pmc = 0;
for (int i = 1; i <= nrt; ++ i)
if (prod[i] > mc) {
mc = prod[i];
pmc = i;
} else if (prod[i] == mc)
pmc = i;
reconst(pmc);
if (pmc < nrt)
printf("%d", (nrt - pmc) * cmmdc);
}
int main() {
freopen("nummst.in", "r", stdin);
freopen("nummst.out", "w", stdout);
scanf("%d", &n);
init();
ciur();
solve();
afis();
return 0;
}