Cod sursa(job #586683)

Utilizator antoanelaAntoanela Siminiuc antoanela Data 2 mai 2011 18:57:13
Problema NumMst Scor 36
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.13 kb
#include <cstdio>
#include <cmath>

int n, d, h, f, a[4000], prev[2][4000], rs; 
double v[2][4000], g, sol;
char p[4000];

int main()
{
    freopen("nummst.in","r",stdin);
    freopen("nummst.out","w",stdout);
    scanf("%d",&n);
    int i, s, x, j, t;
    for (i=2; i*i<=n; i++)
    {
        if (!(n%i))
        {
            d=i;
            break;
        }
    }
    s=d;
    d=n/d;
    for (x=2; x<=s; x++)
        for (i=x+x; i<=s; i+=x) p[i]=1;
    for (i=2; i<=s; i++)
        if (!p[i]) a[++f]=i;
    if (s==2)
	{
        printf("%d %d\n",d,d);
		return 0;
    }
	for (i=1; i<=s; i++) v[0][i]=v[1][i]=-1;
	t=1;
	for (i=1; i<=f; i++)
	{
		for (x=a[i]; x<=s; x*=a[i])
			for (j=s; j>=x; j--)
				if (v[!t][j-x]!=-1)
				{
					g=v[!t][j-x]+log((double)x);
					if (g>v[t][j])
					{
						v[t][j]=g;
						prev[t][j]=x;
					}
				}
		for (j=0; j<=s; j++) 
		{
			v[!t][j]=v[t][j];
			prev[!t][j]=prev[t][j];
		}
		t=!t;
	}
	for (i=2; i<=s; i++)
		if (v[0][i]>sol)
		{
			rs=i;
			sol=v[0][i];
		}
	i=rs;
	while (i)
	{
		printf("%d ",prev[0][i]*d);
		i-=prev[0][i];
	}
	for (i=1; i<=s-rs; i++) printf("%d ",d);
    return 0;
}