Cod sursa(job #936147)

Utilizator bodyionitaIonita Bogdan Constantin bodyionita Data 5 aprilie 2013 18:12:52
Problema NumMst Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.68 kb
#include <cstdio>
#include <algorithm>
#include <cmath>
using namespace std;
#define NMAX 3333

char prim[NMAX];
int v[NMAX];
int n,ram,plus,sol[NMAX],nrs,nrp;
double d[NMAX][502];
short int pred[NMAX][502];
double lnp[NMAX];


int main ()
{
    int i,j,k,lim;


    freopen("nummst.in","r",stdin);
    freopen("nummst.out","w",stdout);
    scanf("%d",&n);
    if(n%2==0) printf("%d %d\n",n/2,n/2);
    else
    if(n%3==0) printf("%d %d\n",n/3,n/3*2);
     else
    {
        lim=sqrt(n);
        plus=1;
        ram=n;
        for(i=2; i<=lim; i++)
            if(n%i==0)
            {
                plus=n/i;
                ram=i;
                break;
            }
        for(i=2; i<=ram; i++)
            if(!prim[i])
            {
                for(j=i*i; j<=ram; j+=i)
                    prim[j]=1;
                v[++nrp]=i;
            }

        for(i=1; i<=ram; i++)
            lnp[i]=log(i);

        for(i=1; i<=ram; i++)
            for(j=1; j<=nrp; j++)
            {
                d[i][j]=d[i][j-1];
                pred[i][j]=0;

                for(k=v[j]; k<=i; k*=v[j])
                    if(d[i][j]<d[i-k][j-1]+lnp[k])
                    {
                        d[i][j]=d[i-k][j-1]+lnp[k];
                        pred[i][j]=k;
                    }
            }
        i=ram;
        j=nrp;
        while(j)
        {
            if(pred[i][j]) sol[++nrs]=pred[i][j]*plus;
            i-=pred[i][j];
            j--;
        }
        if(i) sol[++nrs]=i*plus;
        sort(sol+1,sol+nrs+1);
        for(i=1; i<=nrs; i++)
            printf("%d ",sol[i]);
        printf("\n");
    }
    return 0;
}