Pagini recente » Cod sursa (job #568683) | Cod sursa (job #1182323) | Cod sursa (job #2506904) | Cod sursa (job #2741905) | Cod sursa (job #586666)
Cod sursa(job #586666)
#include <stdio.h>
#include <math.h>
using namespace std;
#define maxn 3210
#define maxd 480
int n, i, j, k, buc, x, md, o, cat;
long long pt;
double d[2][maxn], lg;
short st[maxd][maxn];
int np[maxn];
char f[maxn];
int sol[maxn];
int main()
{
freopen("nummst.in", "r", stdin);
freopen("nummst.out", "w", stdout);
scanf("%d", &n);
for(int i=2; i*i<=n; ++i)
{
if(f[i]==0)
{
np[++np[0]]=i;
for(int j=i*i; 1LL*j*j<=n; j+=i)
f[j]=1;
}
}
for(int i=1; i<=np[0]; ++i)
{
if(n%np[i]==0)
{
buc=n/np[i];
x=np[i];
break;
}
}
for(int i=1; np[i]<x; ++i)
{
md=i;
for(int j=1; j<=x; ++j)
{
d[i][j]=d[i-1][j];
st[i][j]=0;
pt=1;
for(int k=0; j-pt>=0; ++k)
{
if(d[0][j-pt]+k*log10(np[i])>d[1][j])
{
d[1][j]=d[0][j-pt]+k*log10(np[i]);
st[i][j]=pt;
}
pt=pt*np[i];
}
}
for(int j=1; j<=x; ++j)
d[0][j]=d[1][j];
}
for(int i=md; i; --i)
{
cat=st[i][x];
if(cat==0)
continue;
pt=1;
for(o=0; pt<cat; ++o)
pt=pt*np[i];
x-=cat;
sol[++sol[0]]=pt*buc;
}
for(int i=1; i<=x; ++i)
sol[++sol[0]]=buc;
for(int i=1; i<=sol[0]; ++i)
printf("%d ", sol[i]);
printf("\n");
return 0;
}