Pagini recente » Cod sursa (job #550187) | Cod sursa (job #431740) | Cod sursa (job #1925832) | Cod sursa (job #2593934) | Cod sursa (job #968531)
Cod sursa(job #968531)
#include <cmath>
#include <fstream>
#include <algorithm>
using namespace std;
int N;
int ST[2000];
bool isprim[3200];
double val[3200], maxH[3200][2];
int T[3200][2];
int main()
{
ifstream fin("nummst.in");
ofstream fout("nummst.out");
ST[++ST[0]] = 1;
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;
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 k = 1; ST[k] <= i; ++k)
{
int j = ST[k];
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();
}