Pagini recente » Cod sursa (job #2122301) | Cod sursa (job #891770) | Cod sursa (job #262310) | Cod sursa (job #1200174) | Cod sursa (job #1739580)
#include <fstream>
#include <cmath>
using namespace std;
ifstream fin ("nummst.in");
ofstream fout ("nummst.out");
#define MAX 3200
int n, rd, div1, dmin, nr, d[MAX + 1], ind;
bool ok[MAX + 1];
double val[MAX + 1], mx[2][3200];
short t[502][3200];
void NrPrime()
{
ok[1] = 1;
for (int i = 1; i < MAX; i++)
{
if (ok[i] == 0)
{
d[++ind] = i;
for (int j = i * i; j < MAX; j += i)ok[j] = 1;
}
}
for (int i = 1; i < MAX; ++i)
val[i] = log(double(i));
}
void SearchD ()
{
rd = sqrt(n);
div1 = 2;
while (div1 <= rd)
{
if (n % div1 == 0)
{
dmin = div1;
break;
}
if (div1 == 2)div1++;
else div1 += 2;
}
nr = n/dmin;
}
int Rez()
{
int q = 0;
for (int i = 0; i <= nr; ++i)
mx[q][i] = val[1];
int mgo = 0;
for (int i = 1; d[i] < dmin; ++i)
{
mgo++;
q = !q;
for (int j = 0; j <= dmin; ++j)
{
mx[q][j] = mx[!q][j];
t[i][j] = 0;
}
for (int j = 1; j <= nr; ++j)
for (int v = d[i]; v <= j; v *= d[i])
{
if (mx[!q][j - v] + val[v] > mx[q][j])
{
mx[q][j] = mx[!q][j - v] + val[v];
t[i][j] = v;
}
}
}
return mgo;
}
void Afisare(int mgo)
{
int j = dmin;
for (int i = mgo; i > 0; i--)
{
if (t[i][j] != 0) fout << nr * t[i][j] << ' ';
j -= t[i][j];
}
for (int i = 1; i <= j; ++i)
fout << nr << ' ';
}
int main()
{
fin >> n;
NrPrime();
SearchD();
Afisare(Rez());
return 0;
}