Pagini recente » Cod sursa (job #2401989) | Cod sursa (job #1461452) | Cod sursa (job #409321) | Cod sursa (job #2308491) | Cod sursa (job #2528489)
#include <fstream>
#include <cmath>
using namespace std;
ifstream fin("nummst.in");
ofstream fout("nummst.out");
int n,i,j,prim[460],tata[460][3205];
bool w[3205];
double d[460][3205];
int main()
{
fin >> n; int cmmdc = 0;
for (i=2; i*i<=n; i++)
if (n%i == 0)
{
cmmdc = n/i;
break;
}
n /= cmmdc;
w[0] = w[1] = 1; int k = 1; prim[1] = 2;
for (i=2; i<=n; i+=2)
if (w[i] == 0)
{
prim[++k] = i;
for (j=i+i; j<=n; j+=i)
w[j] = 1;
}
for (i=1; i<=k; i++)
{
for (j=1; j<=n; j++)
d[i][j] = max(d[i][j], d[i-1][j]);
if (prim[i] > n)
break;
for (j=0; j<=n; j++)
{
int val = prim[i];
while (j+val <= n)
{
if (d[i-1][j]+log(val) > d[i][j+val])
{
d[i][j+val] = d[i-1][j]+log(val);
tata[i][j+val] = val;
}
val *= prim[i];
}
}
}
while (i > 1)
{
if (tata[i][n] > 0)
{
fout << tata[i][n]*cmmdc << " ";
n -= tata[i][n];
}
i--;
}
while (n > 0)
{
fout << cmmdc << " ";
n--;
}
return 0;
}