Pagini recente » Cod sursa (job #2047562) | Cod sursa (job #1316792) | Cod sursa (job #223162) | Cod sursa (job #427662) | Cod sursa (job #968553)
Cod sursa(job #968553)
#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) fout << cmmdc * T[inow][jnow] << ' ';
jnow = jnow - T[inow][jnow];
--inow;
}
for (int i = 1; i <= jnow; ++i)
fout << cmmdc << ' ';
fin.close();
fout.close();
}