Cod sursa(job #585549)

Utilizator bogdan2412Bogdan-Cristian Tataroiu bogdan2412 Data 30 aprilie 2011 00:11:45
Problema NumMst Scor Ascuns
Compilator c Status done
Runda Marime 1.78 kb
#include <stdio.h>
#include <math.h>

#define MAXN 3162
#define NUM_PRIME 446

char bad[MAXN + 1];
short int primes[NUM_PRIME + 1];

double bst[MAXN + 1][NUM_PRIME + 1];
short int p[MAXN + 1][NUM_PRIME + 1];

inline void redo_it(int N, int pr, int mult) {
    if (pr == 0) {
        for (; N; N--) {
            printf("%d ", mult);
        }
        return;
    }

    int cur = p[N][pr];
    printf("%d ", cur * mult);
    for (; cur % primes[pr] != 0; pr -= 1);
    redo_it(N - cur, pr - 1, mult);
}

inline void solve(int N, int mult) {
    int i, j, k;
    bst[0][0] = 0;
    for (i = 1; i <= N; i++) {
        bst[i][0] = 0;
        for (j = 1; j <= primes[0] && primes[j] < N; j++) {
            bst[i][j] = bst[i][j - 1];
            p[i][j] = p[i][j - 1];
            for (k = primes[j]; k <= i; k *= primes[j]) {
                double cst = bst[i - k][j - 1] + log((double)k);
                if (cst > bst[i][j]) {
                    bst[i][j] = cst;
                    p[i][j] = k;
                }
            }
        }
    }

    for (j = 1; j <= primes[0] && primes[j] < N; j++);
    redo_it(N, j - 1, mult);
    printf("\n");
}

int main() {
    freopen("nummst.in", "rt", stdin);
    freopen("nummst.out", "wt", stdout);

    int N, i, j;
    for (i = 3; i <= MAXN; i += 2) {
        if (bad[i]) {
            continue;
        }
        for (j = i * i; j <= MAXN; j += i) {
            bad[j] = 1;
        }
    }
    primes[primes[0] = 1] = 2;
    for (i = 3; i <= MAXN; i += 2) {
        if (!bad[i]) {
            primes[++primes[0]] = i;
        }
    }

    scanf("%d", &N);
    for (i = 2; i * i <= N; i += 1 + (i != 2)) {
        if (N % i == 0) {
            int gcd = N / i;
            solve(i, gcd);
            return 0;
        }
    }
    printf("%d %d\n", 1, N - 1);
    return 0;
}