Cod sursa(job #586148)

Utilizator eudanipEugenie Daniel Posdarascu eudanip Data 30 aprilie 2011 13:52:30
Problema NumMst Scor 0
Compilator cpp Status done
Runda Algoritmiada 2011, Runda Finală, Clasele 10-12 Marime 1.59 kb
#include<stdio.h>
#include<math.h>

#define ll long long
#define NMAX 100005
#define minim(a,b) (a<b ? a : b)

char prim[NMAX];
ll n,ram,plus,sol[NMAX],nrs,nrp;
ll vec[NMAX],v[NMAX],t[NMAX],s[NMAX];


int main ()
{
    int i,j,p,poz;
    ll lim;
    
    freopen("nummst.in","r",stdin);
    freopen("nummst.out","w",stdout);
    scanf("%lld",&n);
    if(n%2==0)
    {
        printf("%lld %lld\n",n/2,n/2);
        return 0;
    }
    lim=sqrt(n);
    plus=1;
    ram=n;
    for(i=2;i<=lim;i++)
        if(n&i==0)
        {
            plus=n/i;
            ram=i;
            break;
        }
    lim=minim(ram,100006);
    for(i=2;i<=lim;i++)
        if(!prim[i])
            for(j=i*i;j<=lim;j+=i)
                prim[j]=1;
    for(i=2;i<=lim;i++)
        if(!prim[i])
        {
            v[++nrp]=i;
            t[nrp]=i;
            vec[nrp]=i;
        }
    while(1)
    {
        for(i=1;i<=nrp;i++)
            s[i]=s[i-1]+v[i];
        for(i=1;i<=nrp;i++)
            if(s[i]>ram)
                break;
        poz=i-1;
        if(!poz)
            break;
        for(j=poz;j<=nrp;j++)
            if(s[j]-s[j-poz]>ram)
                break;
        p=j-1;
        ram-=(s[p]-s[p-poz]);
        for(i=p-poz+1;i<=p;i++)
        {
            v[i]=t[i]*vec[i]-t[i];
            t[i]*=vec[i];
        }
    }
    for(i=1;i<=nrp;i++)
        if(t[i]!=vec[i])
            sol[++nrs]=t[i]/vec[i]*plus;
    if(ram)
        sol[++nrs]=ram*plus;
    for(i=1;i<=nrs;i++)
        printf("%lld ",sol[i]);
    printf("\n");
    return 0;
}