Cod sursa(job #1474860)

Utilizator enedumitruene dumitru enedumitru Data 23 august 2015 03:07:15
Problema NumMst Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.23 kb
#include <algorithm>
#include <fstream>
#include <cmath>
using namespace std;
ifstream f("nummst.in"); ofstream g("nummst.out");
const int Nmax=3310;
const int Mmax=510;
int Pr[Nmax];
bool Tf[Nmax];
int n,Up,Sol[Nmax],Cnt;
double Log[Nmax],Din[Nmax][Mmax];
short Last[Nmax][Mmax];
int main()
{   f>>n;
    if(n%2==0) {g<<n/2<<' '<<n/2<<'\n'; return 0;}
    if(n%3==0) {g<<n/3<<' '<<n/3*2<<'\n'; return 0;}
    int i,j,k,Lim=int(sqrt(double(n)));
    for(i=2;i<=Lim;++i)
        if(n%i==0) {Up=n/i; n=i; break;}
    for(i=2;i<=n;++i)
        if(Tf[i]==0)
        {   for(j=i*i;j<=n;j+=i) Tf[j]=1;
            Pr[++Pr[0]]=i;
        }
    for(i=1;i<=n;++i) Log[i]=log(i);
    for(i=1;i<=n;++i)
        for(j=1;j<=Pr[0];++j)
        {   Din[i][j]=Din[i][j-1]; Last[i][j]=0;
            for(k=Pr[j];k<=i;k*=Pr[j])
                if(Din[i][j]<Din[i-k][j-1]+Log[k])
                {   Din[i][j]=Din[i-k][j-1]+Log[k]; Last[i][j]=k;}
        }
    int Act=n,NbrP=Pr[0];
    while(NbrP--)
    {   if(Last[Act][NbrP]) Sol[++Cnt]=Last[Act][NbrP]*Up;
        Act-=Last[Act][NbrP];
    }
    if(Act) Sol[++Cnt]=Act*Up;
    sort(Sol+1,Sol+Cnt+1);
    for(int i=1;i<=Cnt;++i) g<<Sol[i]<<' ';
    g<<'\n'; g.close(); return 0;
}