Pagini recente » Cod sursa (job #891416) | Cod sursa (job #585802)
Cod sursa(job #585802)
#include <cstdio>
#include <cstdlib>
const int MAX = 3505;
int n, cmmdc, nrt, nrp, pr[MAX], terms[MAX], last[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;
pr[++ nrp] = 1;
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;
terms[0] = 0;
last[0] = - 1;
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 (terms[j] + 1 > terms[j + pr[i]]) {
terms[j + pr[i]] = terms[j] + 1;
last[j + pr[i]] = j;
}
}
}
}
void reconst(int poz) {
if(poz == 0)
return ;
printf("%d ", (poz - last[poz]) * cmmdc);
reconst(last[poz]);
}
void afis() {
int mc = - 1, pmc = 0;
for (int i = 1; i <= nrt; ++ i)
if (terms[i] > mc) {
mc = terms[i];
pmc = i;
} else if (terms[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;
}