Cod sursa(job #585749)

Utilizator vladiiIonescu Vlad vladii Data 30 aprilie 2011 11:37:32
Problema NumMst Scor 9
Compilator cpp Status done
Runda Algoritmiada 2011, Runda Finală, Clasele 10-12 Marime 1.2 kb
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <vector>
using namespace std;
#define maxn 5000010

int N, maxdiv;
int tt[maxn];
double A[maxn];
vector<int> gramezi;

int main() {
    FILE *f1=fopen("nummst.in", "r"), *f2=fopen("nummst.out", "w");
    int i, j, p, q;

    fscanf(f1, "%d\n", &N);

    for(i=1; i<=N/2; i++) {
        if(N % i == 0) {
            maxdiv = i;
        }
    }

    N = N / maxdiv;

    A[1] = log(1); A[2] = log(1); A[3] = log(2); A[4] = log(4);

    for(i=5; i<=N; i++) {
        int rad = sqrt(i);

        for(j=i; j>=rad; j--) {
            if(log(j) + A[i-j] >= A[i]) {
                A[i] = log(j) + A[i-j];
                tt[i] = i - j;
            }
        }
    }

    int val = N;

    while(val) {
        int pietre = val - tt[val];

        //fprintf(f2, "%d ", maxdiv * pietre);
        gramezi.push_back(maxdiv * pietre);

        val = tt[val];
    }

    if(gramezi.size() == 1) {
        int asd = gramezi[0];
        asd = asd / 2;
        gramezi[0] = asd;
        gramezi.push_back(asd);
    }

    for(i=0; i<gramezi.size(); i++) {
        fprintf(f2, "%d ", gramezi[i]);
    } fprintf(f2, "\n");

    fclose(f1); fclose(f2);
    return 0;
}