Cod sursa(job #918353)

Utilizator apopeid13Apopeid Alejandro apopeid13 Data 18 martie 2013 20:21:00
Problema NumMst Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.55 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 Lim = int(sqrt(double(N)));
    for (int i=2;i<=Lim;++i)
        if ( N%i == 0 )
        {
            Up = N/i, N = i;
            break;
        }
    for (int i=2;i<=N;++i)
        if( TF[i] == 0 )
        {
            for(int j=i*i;j<=N;j+=i)
                TF[j]=1;
            Pr[++Pr[0]]=i;
        }
 
    for(int i=1;i<=N;++i)
        Log[i]=log(i);
 
    for (int i=1;i<=N;++i)
        for (int j=1;j<=Pr[0];++j)
        {
            Din[i][j]=Din[i][j-1];
            Last[i][j]=0;
            for (int 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';
 
    F.close();
    G.close();
    return 0;
}