Pagini recente » Cod sursa (job #1625206) | Cod sursa (job #1849894) | Cod sursa (job #1385006) | Cod sursa (job #2396446) | Cod sursa (job #2528488)
#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;
///dupa ce dam cmmdc factor comun, avem de scris pe n/cmmdc
///ca suma de nr puteri de factori primi
///acum n este acel i - primul divizor care este prim
///prin care se imparte, deci acum <= 3200
///d[i][j] = cmmmc maxim pentru suma j cu primii i factori primi
///d[i][j+p[ind]^t] = max(d[][], d[i][j]*p[ind]^t);
///prin log, obtin d[i+1][j+p[ind]^t] = d[i][j]+t*log(p[ind])
w[0] = w[1] = 1; int k = 0;// prim[++k] = 1;
for (i=2; i<=3200; i++)
if (w[i] == 0)
{
prim[++k] = i;
for (j=i+i; j<=3200; 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;
}