Cod sursa(job #585696)

Utilizator robigiirimias robert robigi Data 30 aprilie 2011 11:09:42
Problema NumMst Scor 36
Compilator cpp Status done
Runda Algoritmiada 2011, Runda Finală, Clasele 10-12 Marime 1.68 kb
#include <cstdio>

using namespace std;

FILE *f=fopen("nummst.in", "r");
FILE *g=fopen("nummst.out", "w");

int n;
bool v[10000001];
int w[10000];
int aj[10000];
int nr[10000];
int aux[10000];
int u;

void swape(int &x, int &y)
{
    int h=x; x=y; h=y;
}

int main()
{
    fscanf(f, "%d", &n);

    if (n%2==0)
    {
        fprintf(g, "%d %d", n/2, n/2);

        fclose(f);
        fclose(g);

        return 0;
    }

    int i=0;
    int ok=0;

    for (i=2; i*i<=n; ++i)
    {

        if (v[i]==0)
        {
            if (n%i==0)
             {
                 ok=1;
                 break;
             }
            for (int j=i+i; j*j<=n; j+=i)
                v[j]=1;
        }
    }

    int cmmdc=n/i;
    int cv=n/cmmdc;

    if (!ok)
    {
        cv=n;
        cmmdc=1;
    }

    for (i=2; i<=cv; ++i)
    {
        if (v[i]==0)
        {
            w[++u]=i;
            aux[u]=i;
            aj[u]=i*(i-1);
            nr[u]=u;
            cv-=i;
        }
    }

    if (cv==0)
    {
        for (int l=1; l<=u; ++l)
            fprintf(g, "%d ", cmmdc*w[l]);
    }
    else
    {
        while (cv>aj[1])
        {
            w[nr[1]]+=aj[1];
            cv-=aj[1];
            aj[1]=w[1]*(aux[1]-1);
            int k=1;
            while (aux[nr[k]]*aj[k+1]<aj[k]*aux[nr[k+1]])
            {
                swape(nr[k], nr[k+1]);
                swape(aj[k], aj[k+1]);
                ++k;
            }
        }
        if (cv!=0)
            w[++u]=cv;

         for (int l=1; l<=u; ++l)
            fprintf(g, "%d ", cmmdc*w[l]);
    }

    fclose(f);
    fclose(g);

    return 0;
}