Pagini recente » Cod sursa (job #372213) | Autentificare | Cod sursa (job #230932) | Cod sursa (job #1136549) | Cod sursa (job #585792)
Cod sursa(job #585792)
#include <stdio.h>
#include <math.h>
#define NMAX 4005
#define LMAX 555
int n,m,A[NMAX],r,sol[NMAX],t;
int use[LMAX][NMAX],tip[NMAX];
double best[LMAX][NMAX],rez;
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(nr-1,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=log10(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;
}
}
}
}
for (i=1; i<=r; i++)
if (best[i][m]>rez)
rez=best[i][m],st=i;
reconst(st,m);
for (i=1; i<=t; i++)
{
s+=sol[i];
printf("%d ",n/m*sol[i]);
}
for (i=1; i<=m-s; i++)
printf("%d ",n/m);
printf("\n");
return 0;
}