Pagini recente » Cod sursa (job #1643790) | Cod sursa (job #1513697) | Cod sursa (job #2639546) | Cod sursa (job #1938625) | Cod sursa (job #592466)
Cod sursa(job #592466)
#include <algorithm>
#include <stdio.h>
#include <math.h>
#include <vector>
#define pb push_back
#define eps 0.00001
#define MAX 4096
using namespace std;
int n, diviz;
int sel[MAX];
double sol[570][MAX];
vector <int> vctPrime, vctNr;
int main()
{
freopen("nummst.in", "r", stdin);
freopen("nummst.out", "w", stdout);
scanf("%d", &n);
for (int i = 2; i * i <= n; i++)
if (n % i == 0)
{
diviz = n / i;
n = i;
}
if (n < 5)
n--, vctNr.pb(1);
vctPrime.pb(0);
for (int i = 2; i <= n; i++)
if (!sel[i])
{
for (int j = i * i; j <= n; j += i)
sel[j] = 1;
vctPrime.pb(i);
}
for (int i = 1; i < vctPrime.size(); i++)
{
for (int j = 1; j <= n; j++)
{
sol[i][j] = sol[i - 1][j];
int ad = vctPrime[i];
for (; ad <= j; ad *= vctPrime[i])
sol[i][j] = max(sol[i][j], sol[i - 1][j - ad] + log((double) ad));
}
}
int act = vctPrime.size() - 1, pus = n;
for (; act; act--)
{
if (fabs(sol[act][pus] - sol[act - 1][pus]) <= eps)
continue;
else
{
int ad = vctPrime[act];
for (; ad <= pus; ad *= vctPrime[act])
if (fabs(sol[act][pus] - sol[act - 1][pus - ad] - log((double) ad)) <= eps)
{
pus -= ad;
vctNr.pb(ad);
break;
}
}
}
for (; pus; pus--)
vctNr.pb(1);
sort(vctNr.begin(), vctNr.end());
for (int i = 0; i < vctNr.size(); i++)
printf("%d ", vctNr[i] * diviz);
fclose(stdin);
fclose(stdout);
return 0;
}