Cod sursa(job #518)

Utilizator mariusdrgdragus marius mariusdrg Data 11 decembrie 2006 14:23:18
Problema Numere 2 Scor 85
Compilator cpp Status done
Runda Arhiva de probleme Marime 4.43 kb
#include<stdio.h>
#include<string>

const int maxn = 101;

short a[maxn],x[maxn];
short x1[maxn];
short i,p1[maxn];
char s[maxn];
short rez2[maxn],rez[maxn];
short p;
short j;

int max (int a,int b)
{
        if (a>b)    return a;
        return b;

}

void ad()
{
        x[0]=max(p1[0],x[0]);
        for(i=1;i<=x[0];i++)
                x[i]+=p1[i];
        for(i=1;i<=x[0];i++)
        {
                if (x[i]>=10)
                {
                        x[i+1]+=1;
                        x[i]%=10;
                }
                if (x[x[0]+1]!=0) x[0]++;
        }
}


int rid(int p)
{
         short p2=0;
         memset(rez2,0,(rez2[0]+1)*sizeof(short));
         memset(rez,0,(rez[0]+1)*sizeof(short));
         memset(x1,0,(x1[0]+1)*sizeof(short));
         rez[0]=1;
         rez[1]=1;
         for(i=1;i<=max(p1[0],x[0]);i++)
                x1[i]+=p1[i]+x[i];
         x1[0]=max(p1[0],x[0]);
         for(i=1;i<=x1[0];i++)
         {
                if (x1[i]>=10)
                {
                        x1[i]%=10;
                        x1[i+1]++;
                }
                if (x1[x1[0]+1]>0) x1[0]++;
         }
         if (p1[1]==2&&p1[0]==1)
         {
                p1[1]=2;
         }
         while (p2<p)
         {
                p2++;
                memset(rez2,0,(rez2[0]+1)*sizeof(short));
                if (x1[0]+rez[0]-1>a[0]) return 0;
                for(i=1;i<=x1[0];i++)
                        for(j=1;j<=rez[0];j++)
                                rez2[i+j-1]+=rez[j]*x1[i];
                rez2[0]=rez[0]+x1[0]-1;
                for(i=1;i<=rez2[0];i++)
                {
                        if (rez2[i]>10)
                        {
                                rez2[i+1]+=rez2[i]/10;
                                rez2[i]%=10;
                                if (rez2[rez2[0]+1]>0) rez2[0]++;
                        }
                }
                memcpy(rez,rez2,(rez2[0]+1)*sizeof(short));
         }
         if (rez[0]!=a[0])
         {
                if (rez[0]<a[0])return 1;
                return 0;
         }
         for(i=rez[0];i>0;i--)
         {
                if (a[i]!=rez[i])
                {
                        if (rez[i]<a[i])return 1;
                        return 0;
                }
         }
         return 2;
}

void inmul(int p)
{
        for(i=1;i<=p1[0];i++)
        {
                p1[i]*=p;
        }
        for(i=1;i<=p1[0];i++)
        {
                if (p1[i]>=10)
                {
                        p1[i]%=10;
                        p1[i+1]++;
                        if (i==p1[0]) p1[0]++;
                }
        }
}

void imp(int p)
{
        for(i=p1[0];i>0;i--)
        {
                p1[i-1]+=(p1[i]%p)*10;
                p1[i]/=p;
                if (p1[p1[0]]==0)p1[0]--;
        }
}

bool ver()
{
        if (p1[0]>(a[0]*20/p))  return false;
        if (p1[0]!=a[0]) return p1[0]<a[0];
        for(i=p1[0];i>0;i--)
                if(p1[i]!=a[i]) return p1[i]<a[i];
        return false;


}

int main()
{
        freopen("numere2.in","r",stdin);
        freopen("numere2.out","w",stdout);
        scanf("%s",&s);
        a[0]=strlen(s);
        for(i=0;i<=a[0]-1;i++)
        {
                a[i+1]=s[a[0]-i-1]-'0';
        }
        p1[0]=1;
        p1[1]=1;
        for(p=150;p>0;p--)
        {
                memset(x,0,(x[0]+1)*sizeof(short));
                memset(x1,0,(x1[0]+1)*sizeof(short));
                memset(p1,0,(p1[0]+1)*sizeof(short));
                p1[0]=1;
                if (p==4)
                {
                        p=4;
                }
                p1[1]=1;
                for(;ver();inmul(2));
                for(;p1[0];imp(2))
                {
                        int x3=rid(p);
                        if (x3==1)
                        {
                                ad();
                        }
                        if (x3==2)
                        {
                                ad();
                                for(i=x[0];i>0;i--)printf("%d",x[i]);
                                printf("\n%d",p);
                                return 0;
                        }
                }

        }
        for(i=a[0];i>0;i--)
                printf("%d",a[i]);
        printf("\n1");
        return 0;
        return 0;

}