Cod sursa(job #585802)

Utilizator dushmiMihai-Alexandru Dusmanu dushmi Data 30 aprilie 2011 11:55:09
Problema NumMst Scor 24
Compilator cpp Status done
Runda Algoritmiada 2011, Runda Finală, Clasele 10-12 Marime 1.9 kb
#include <cstdio>
#include <cstdlib>

const int MAX = 3505;

int n, cmmdc, nrt, nrp, pr[MAX], terms[MAX], last[MAX];

void init() {
    int i = 2;

    for (i = 2; i <= n; ++ i)
        if (n % i == 0)
            break;

    cmmdc = n / i;
    nrt = i;

    if (nrt == 2) {
        printf("%d %d\n", cmmdc, cmmdc);
        exit(0);
    }

    if (nrt == 3) {
        printf("%d %d\n", cmmdc, 2 * cmmdc);
        exit(0);
    }
}

void ciur() {
    bool f[MAX];

    for (int i = 0; i < MAX; ++ i)
        f[i] = 0;

    pr[++ nrp] = 1;

    for (int i = 2; i < MAX; ++ i)
        if (!f[i]) {
            pr[++ nrp] = i;
            for (int j = i * i; j < MAX; j += i)
                f[j] = 1;
        }
}

void solve() {
    bool r[MAX];

    for (int i = 0; i < MAX; ++ i)
        r[i] = 0;

    r[0] = 1;
    terms[0] = 0;
    last[0] = - 1;

    for (int i = 1; i <= nrp; ++ i) {
        if (pr[i] > nrt)
            break;
        for (int j = nrt; j >= 0; -- j)
            if (r[j] && j + pr[i] <= nrt) {
                r[j + pr[i]] = 1;
                if (terms[j] + 1 > terms[j + pr[i]]) {
                    terms[j + pr[i]] = terms[j] + 1;
                    last[j + pr[i]] = j;
                }
            }
    }
}

void reconst(int poz) {
    if(poz == 0)
        return ;
    printf("%d ", (poz - last[poz]) * cmmdc);
    reconst(last[poz]);
}

void afis() {
    int mc = - 1, pmc = 0;

    for (int i = 1; i <= nrt; ++ i)
        if (terms[i] > mc) {
            mc = terms[i];
            pmc = i;
        } else if (terms[i] == mc)
            pmc = i;

    reconst(pmc);

    if (pmc < nrt)
        printf("%d", (nrt - pmc) * cmmdc);
}

int main() {
    freopen("nummst.in", "r", stdin);
    freopen("nummst.out", "w", stdout);

    scanf("%d", &n);

    init();
    ciur();
    solve();
    afis();

    return 0;
}