Pagini recente » Cod sursa (job #1011013) | Cod sursa (job #3139381) | Cod sursa (job #2613300) | Cod sursa (job #2383006) | Cod sursa (job #968550)
Cod sursa(job #968550)
#include <cmath>
#include <cstring>
#include <fstream>
#include <algorithm>
using namespace std;
int N;
int ST[2000];
bool isprim[3200];
double val[3200], maxH[2][3200];
short T[502][3200];
int result[3200];
int main()
{
ifstream fin("nummst.in");
ofstream fout("nummst.out");
for (int i = 2; i <= 3200; ++i)
if (!isprim[i])
{
ST[++ST[0]] = i;
for (int j = i * i; j <= 3200; j += i)
isprim[j] = true;
}
for (int i = 1; i <= 3200; ++i)
val[i] = log(i);
fin >> N;
int cmmdc = 0;
for (int i = 2; i * i <= N; ++i)
if (N % i == 0)
cmmdc = max(cmmdc, N / i);
int M = N / cmmdc;
int act = 0;
for (int i = 0; i <= M; ++i)
maxH[act][i] = val[1];
int maxgo = 0;
for (int i = 1; ST[i] < M; ++i)
{
++maxgo;
act = !act;
for (int j = 0; j <= M; ++j)
maxH[act][j] = -1;
for (int j = 1; j <= M; ++j)
{
int valnow = 1;
for (int k = 0; valnow <= j; ++k, valnow *= ST[i])
{
if (maxH[!act][j - (valnow == 1 ? 0 : valnow)] + val[valnow] > maxH[act][j])
{
maxH[act][j] = maxH[!act][j - (valnow == 1 ? 0 : valnow)] + val[valnow];
T[i][j] = (valnow == 1 ? 0 : valnow);
}
}
}
}
int inow = maxgo, jnow = M;
while (inow != 0)
{
if (T[inow][jnow] != 0) result[++result[0]] = cmmdc * T[inow][jnow];
jnow = jnow - T[inow][jnow];
--inow;
}
for (int i = 1; i <= jnow; ++i)
result[++result[0]] = cmmdc;
sort(result + 1, result + result[0] + 1);
for (int i = 1; i <= result[0]; ++i)
fout << result[i] << ' ';
fout << '\n';
fin.close();
fout.close();
}