Pagini recente » Cod sursa (job #480691) | usu8 | Cod sursa (job #870350) | Cod sursa (job #876797) | Cod sursa (job #586558)
Cod sursa(job #586558)
#include <cstdio>
#include <cmath>
#include <vector>
#include <algorithm>
using namespace std;
const int N = 1005;
double prod[N][3300];
int nrp, n, cmmdc, nb, pr[N], pred[N][3300];
bool d[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] = 0;
pred[0][j] = j - 1;
d[0][j] = 1;
}
for (int i = 1; i <= nrp; ++ i) {
int newv = pr[i];
d[i][0] = 1;
while (newv < n) {
for (int j = 0; j <= n - newv; ++ j)
if (d[i - 1][j] && prod[i - 1][j] + (double)log((double)newv) > prod[i][j + newv]) {
prod[i][j + newv] = prod[i - 1][j] + (double)log((double)newv);
pred[i][j + newv] = j;
d[i][j + newv] = 1;
}
newv *= pr[i];
}
for (int j = 0; j <= n; ++ j)
if (prod[i - 1][j] > prod[i][j] || (! d[i][j])) {
prod[i][j] = prod[i - 1][j];
pred[i][j] = j;
d[i][j] = 1;
}
}
}
vector <int> v;
void cycles(int n, int last) {
if (n == 0)
return;
double M = - 1;
int pozM = 0;
for (int i = 0; i < last; ++ i)
if (prod[i][n] > M && d[i][n]) {
M = prod[i][n];
pozM = i;
}
if (pred[pozM][n] != n)
printf("%d ", (n - pred[pozM][n]) * cmmdc);
cycles(pred[pozM][n], pozM);
}
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, nrp + 1);
return 0;
}