Pagini recente » Cod sursa (job #712446) | Cod sursa (job #1259200) | Cod sursa (job #1753363) | Cod sursa (job #1742237) | Cod sursa (job #586563)
Cod sursa(job #586563)
#include <cstdio>
#include <cmath>
#include <vector>
#include <algorithm>
using namespace std;
const int N = 505;
double M, prod[2][3300];
int nrp, n, cmmdc, nb, pozM, pr[N];
short int pred1[N][3300], pred2[N][3300];
void ciur() {
bool f[n + 2];
for (int i = 1; i <= n; ++ i)
f[i] = 0;
pr[0] = 1;
for (int i = 2; i <= n; ++ i)
if (! f[i]) {
pr[++ nrp] = i;
for (int j = i * i; j <= n; j += i)
f[j] = 1;
}
}
void solve() {
for (int j = 0 ; j <= n; ++ j) {
prod[0][j] = 1;
pred1[0][j] = 0;
pred2[0][j] = j - 1;
}
for (int i = 1; i <= nrp; ++ i) {
int newv = pr[i];
for (int j = 0; j <= n; ++ j)
prod[i & 1][j] = 0;
while (newv < n) {
for (int j = 0; j <= n - newv; ++ j)
if (prod[(i - 1) & 1][j] && prod[(i - 1) & 1][j] + (double)log((double)newv) > prod[i & 1][j + newv]) {
prod[i & 1][j + newv] = prod[(i - 1) & 1][j] + (double)log((double)newv);
pred1[i][j + newv] = i - 1;
pred2[i][j + newv] = j;
}
newv *= pr[i];
}
for (int j = 0; j <= n; ++ j)
if (prod[(i - 1) & 1][j] > prod[i & 1][j]) {
prod[i & 1][j] = prod[(i - 1) & 1][j];
pred1[i][j] = i - 1;
pred2[i][j] = j;
}
if (prod[i & 1][n] > M) {
M = prod[i & 1][n];
pozM = i;
}
}
}
vector <int> v;
void cycles(int n, int pr) {
if (n == 0)
return;
if (pred2[pr][n] != n)
printf("%d ", (n - pred2[pr][n]) * cmmdc);
cycles(pred2[pr][n], pred1[pr][n]);
}
int main() {
freopen("nummst.in", "r", stdin);
freopen("nummst.out", "w", stdout);
scanf("%d", &nb);
for (int i = 2; i <= nb; ++ i)
if (nb % i == 0) {
n = i;
cmmdc = nb / i;
break;
}
ciur();
solve();
cycles(n, pozM);
return 0;
}