Pagini recente » Cod sursa (job #130565) | Cod sursa (job #2880595) | Cod sursa (job #973833) | Cod sursa (job #2131540) | Cod sursa (job #585754)
Cod sursa(job #585754)
#include <stdio.h>
#include <algorithm>
#include <math.h>
#define NMAX 4005
#define LMAX 555
using namespace std;
int n,m,A[NMAX],r,sol[NMAX],t;
int use[LMAX][NMAX],tip[NMAX];
double best[LMAX][NMAX];
inline int prim(int x)
{
if (x==1)
return 0;
if (x==2)
return 1;
if (x % 2==0)
return 0;
int i;
for (i=3; i*i<=x; i+=2)
if (x%i==0)
return 0;
return 1;
}
void reconst(int nr,int val)
{
if (nr==0 || val==0)
return ;
sol[++t]=use[nr][val];
reconst(tip[use[nr][val]],val-use[nr][val]);
}
int main()
{
freopen("nummst.in","r",stdin);
freopen("nummst.out","w",stdout);
scanf("%d",&n);
int i,s=0;
for (i=2; i*i<=n; i++)
if (n%i==0)
{
m=i;
break ;
}
for (i=2; i<m; i++)
if (prim(i))
A[++r]=i;
int j,k,st,cnt;
double val;
for (i=1; i<=r; i++)
{
for (j=0; j<=m; j++)
{
best[i][j]=best[i-1][j];
use[i][j]=use[i-1][j];
}
val=log((double)A[i]);
for (j=0; j<=m; j++)
{
st=1; cnt=0;
while (1)
{
st*=A[i]; cnt++;
if (j+st>m)
break ;
tip[st]=i;
if (best[i][j+st]<best[i-1][j]+val*cnt)
{
best[i][j+st]=best[i-1][j]+val*cnt;
use[i][j+st]=st;
}
}
}
}
reconst(r,m);
sort(sol+1,sol+t+1);
for (i=1; i<=t; i++)
s+=sol[i];
for (i=1; i<=m-s; i++)
printf("%d ",n/m);
for (i=1; i<=t; i++)
printf("%d ",n/m*sol[i]);
printf("\n");
return 0;
}