Pagini recente » Cod sursa (job #2710443) | Cod sursa (job #2416989) | Cod sursa (job #3136682) | Cod sursa (job #2111313) | Cod sursa (job #1739578)
#include <fstream>
#include <cmath>
using namespace std;
ifstream fin ("nummst.in");
ofstream fout ("nummst.out");
#define MAX 3200
int n, rd, div, 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);
div = 2;
while (div <= rd)
{
if (n % div == 0)
{
dmin = div;
break;
}
if (div == 2)div++;
else div += 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;
}