Cod sursa(job #586060)

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

int N, maxdiv;
int viz[maxn];
vector<int> prim, gramezi;
vector<pair<int, int> > sum;

void ciur() {
    int i, j;

    for(i=2; i<=N; i++) {
        if(!viz[i]) {
            prim.push_back(i);

            for(j=2*i; j<=N; j+=i) {
                viz[j] = 1;
            }
        }
    }
}

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

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

    int rad = sqrt(N);
    for(i=1; i<=rad; i++) {
        if(N % i == 0) {
            maxdiv = max(maxdiv, i);
            maxdiv = max(maxdiv, N / i);
        }
    }

    N = N / maxdiv;

    ciur();

    p = q = 0;
    int asd = 1;
    while(asd && q < prim.size()) {
        if(p + prim[q] <= N) {
            p = p + prim[q];

            sum.push_back( make_pair(p, prim[q]) );
        }
        else {
            asd = 0;
        }
        q ++;
    }

    while(1) {
        int ok = 0;
        for(i=sum.size()-1; i>=0; i--) {
            if(p + sum[i].second <= N) {
                sum[i].first = sum[i].first * sum[i].second;
                p = p + sum[i].second;
                ok = 1; break;
            }
        }
        if(!ok) break;
    }

    while(p < N) {
        sum.push_back( make_pair(1, 1) );
        p ++;
    }

    for(i=0; i<sum.size(); i++) {
        gramezi.push_back( maxdiv * sum[i].first );
    }

        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;
}