Cod sursa(job #585968)

Utilizator antoanelaAntoanela Siminiuc antoanela Data 30 aprilie 2011 13:00:04
Problema NumMst Scor 0
Compilator cpp Status done
Runda Algoritmiada 2011, Runda Finală, Clasele 10-12 Marime 2.79 kb
#include <cstdio>
#define lmax 1000

int n, d, v[4000][lmax], h, f, a[10000], prev[4000], g[lmax], rs, sol[lmax];
char p[11000];

void produs(int a[lmax], int b[lmax], int x)
{
    int i, t=0;
    for (i=1; i<=a[0]; i++) a[i]=0;
    a[0]=0;
    for (i=1; i<=b[0]; i++)
    {
        a[0]++;
        a[i]=b[i]*x+t;
        t=a[i]/10;
        a[i]%=10;
    }
    while (t)
    {
        a[++a[0]]=t%10;
        t/=10;
    }
}

int maimare(int a[lmax], int b[lmax])
{
    if (a[0]>b[0]) return 1;
    if (a[0]<b[0]) return 0;
    int i;
    for (i=a[0]; i>0; i--)
        if (a[i]!=b[i]) return a[i]>b[i];
    return 0;
}

int main()
{
    freopen("nummst.in","r",stdin);
    freopen("nummst.out","w",stdout);
    scanf("%d",&n);
    int i, c, k, s, x, j, y;
    for (i=2; i*i<=n; i++)
    {
        if (!(n%i))
        {
            d=i;
            break;
        }
    }
    s=d;
    d=n/d;
    for (x=2; x<=s; x++)
        for (i=x+x; i<=s; i+=x) p[i]=1;
    for (i=1; i<=s; i++)
        if (!p[i]) a[++f]=i;
    long long u;;
    u=1;
    x=0;
   /*for (i=1; i<=f; i++)
{
    u=u*a[i];
    x+=a[i];

    printf("%d %I64d %d\n",a[i], u, x);
}*/
    if (s==2)
    {
        h=2;
        printf("%d %d\n",d,d);
    } else
    {
        v[0][0]=1;
        v[0][1]=1;
        for (i=1; i<=f; i++)
            for (j=s; j>=a[i]; j--)
                if (v[j-a[i]][0])
                {
                    produs(g, v[j-a[i]], a[i]);
                   // if (j==s)
                    {


                //   printf("\n");
                  // for (y=v[j-a[i]][0]; y>0; y--) printf("%d",v[j-a[i]][y]);
                    }
                    if (maimare(g, v[j]))
                    {
                        prev[j]=i;
                        for (y=0; y<=g[0]; y++) v[j][y]=g[y];
                    }
                    //if (j==s)
                    {

                  /*  printf("\n%d %d %d\n",i,j,a[i]);
                    for (y=g[0]; y>0; y--)printf("%d",g[y]);
                    printf("\n");
                    for (y=v[j][0]; y>0; y--) printf("%d",v[j][y]);*/
                    }
                }
        for (i=1; i<=s; i++)
        {
            if (maimare(v[i], sol))
            {
                rs=i;
                for (y=0; y<=v[i][0]; y++) sol[y]=v[i][y];
            }
        }
       // printf("%ddf\n",rs);
        i=rs;
        u=1;
       while (i)
        {
            printf("%d ",a[prev[i]]*d);
            u=u*a[prev[i]];
            i-=a[prev[i]];
        }
        //printf("%I64daa\n",u);
    }
  //  for (i=1; i<=h; i++) printf("%d ", v[i]*d);

    a[0]=3;
    a[1]=2;
    a[2]=5;
    a[3]=4;
    produs(g, a, 123);
    for (i=g[0]; i>0; i--) printf("%d",g[i]);
    return 0;
}