Cod sursa(job #585952)

Utilizator mottyMatei-Dan Epure motty Data 30 aprilie 2011 12:50:28
Problema NumMst Scor 0
Compilator cpp Status done
Runda Algoritmiada 2011, Runda Finală, Clasele 10-12 Marime 1.53 kb
#include <fstream>
#include <vector>

using namespace std;

ifstream in("nummst.in");
ofstream out("nummst.out");

const int N = 350005;
const int M = 5000001;

int n;
int dv;
int dc;
int cm;
int pcm;
int rcm;
int div[N];
int sol[N];
int bSol[N];

bool ciur[M];

int GetDiv()
{
    for (int i = 2; i <= n; ++i)
        if (n % i == 0)
            return i;
}

void SetDiv()
{
    for (int i = 2; i < dv; ++i)
        if (!ciur[i])
        {
            div[++dc] = i;
            //out << div[dc] << "\n";

            for (int j = i + i; j < dv; j += i)
                ciur[j] = true;
        }
}

void Check(int pos, int rem)
{
    int bAct = 1;
    for (int i = 1; i < pos; ++i)
        if (sol[i])
            bAct *= sol[i] * div[i];

    if (bAct > cm)
    {
        cm = bAct;
        pcm = pos;
        rcm = rem;
        for (int i = 1; i < pos; ++i)
            bSol[i] = sol[i];
    }
}

void GoDiv(int pos, int rem)
{
    if (pos > dc || rem < div[pos])
    {
        Check(pos, rem);
        return;
    }

    for (int i = 0; i * div[pos] <= rem; ++i)
    {
        sol[pos] = i;
        GoDiv(pos + 1, rem - i * div[pos]);
    }
}

void Print()
{
    int kk = n / dv;
    for (int i = 1; i < pcm; ++i)
        if (bSol[i])
            out << bSol[i] * div[i] * kk << " ";
    if (rcm)
        out << rcm * kk << "\n";
}

int main()
{
    in >> n;

    dv = GetDiv();
//    out << dv << "\n"; DV e bun
    if(dv == 2)
    {
        out << n/2 << " " << n/2 << "\n";
        return 0;
    }
    SetDiv();
    GoDiv(1, dv);
    Print();

    return 0;
}