Cod sursa(job #586667)

Utilizator GavrilaVladGavrila Vlad GavrilaVlad Data 2 mai 2011 18:36:15
Problema NumMst Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.51 kb
#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)
        {
            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;
}