Cod sursa(job #586234)

Utilizator ciprianfFarcasanu Alexandru Ciprian ciprianf Data 30 aprilie 2011 14:12:05
Problema NumMst Scor 13
Compilator cpp Status done
Runda Algoritmiada 2011, Runda Finală, Clasele 10-12 Marime 1.32 kb
#include <stdio.h>
#include <bitset>
#include <algorithm>
using namespace std;
#define N_MAX 10000010
bitset <N_MAX> b;
int v[10000], prim[10000];
int n, val;
void found(int x) {
    int s = x, i, p;
    val = n/x;
    for(i = 1; i <= prim[0] && s >= prim[i]; ++i)
        v[++v[0]] = prim[i], s-= prim[i];
    p = i;
    if(s == 0) return;
    if(s == 1) {
        v[++v[0]] = 1;
        return ;
    }
    int ok = 1;
    while(ok) {
        ok = 0;
        sort(v + 1, v + v[0] + 1);
        for(int i = 1; i <= v[0]; ++i)
            if(s+v[i] >= prim[p]) {
                s = s+v[i] - prim[p];
                v[i] = prim[p];
                p++;
                ok = 1;
            }
    }
    if(s != 0) v[++v[0]] = s;
}
void ciur() {
    for(int i = 4; i <= n; i+= 2) b[i] = 1;
    prim[++prim[0]] = 2;
    for(int i = 3; i <= n; i += 2)
        if(!b[i]) {
            if(n%i==0) {
                found(i);
                return;
            }
            prim[++prim[0]] = i;
            for(int j = i; (long long) j*i <= n; ++j)
                b[i*j] = 1;
        }
}
int main() {
    freopen("nummst.in", "r", stdin);
    freopen("nummst.out" ,"w", stdout);
    scanf("%d", &n);
    if(n%2 == 0)
        found(2);
    else ciur();
    for(int i = 1; i <= v[0]; ++i)
        printf("%d ", v[i]*val);
    printf("\n");
    return 0;
}