Pagini recente » Cod sursa (job #2405807) | Cod sursa (job #2038180) | Cod sursa (job #252897) | Cod sursa (job #1691068) | Cod sursa (job #968529)
Cod sursa(job #968529)
#include <cmath>
#include <fstream>
#include <algorithm>
using namespace std;
int N;
bool isprim[3200];
double val[3200], maxH[3200][2];
int T[3200][2];
int main()
{
ifstream fin("nummst.in");
ofstream fout("nummst.out");
for (int i = 2; i <= 3200; ++i)
if (!isprim[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;
maxH[0][0] = val[1];
maxH[1][0] = val[1];
T[1][0] = 1;
for (int i = 2; i <= M; ++i)
{
maxH[i][0] = maxH[i][1] = -1;
for (int j = 1; j <= i; ++j)
{
if (j != i && !isprim[j] && maxH[i][1] < maxH[i - j][0] + val[j])
{
maxH[i][1] = maxH[i - j][0] + val[j];
maxH[i][0] = maxH[i][1];
T[i][1] = T[i][0] = j;
}
else if (!isprim[j] && maxH[i][0] < maxH[i - j][0] + val[j])
{
maxH[i][0] = maxH[i - j][0] + val[j];
T[i][0] = j;
}
}
}
int now = M;
bool firsttime = true;
while (now != 0)
{
if (firsttime)
{
fout << cmmdc * T[now][1] << ' ';
now -= T[now][1];
firsttime = false;
}
else
{
fout << cmmdc * T[now][0] << ' ';
now -= T[now][0];
}
}
fin.close();
fout.close();
}