Cod sursa(job #1676643)

Utilizator badea_adi1999Badea Adrian Catalin badea_adi1999 Data 6 aprilie 2016 03:47:07
Problema Numere 2 Scor 85
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.99 kb
#include <fstream>
#include <cstdio>
#include <cstring>
#define nmax 215
using namespace std;
int n,v[nmax],put[nmax],sol[nmax];
int st[nmax],dr[nmax],mid[nmax];
char s[nmax];

void clearing(int k[])
{
    int i;
    for (i=1;i<=k[0];i++)
        k[i]=0;
    k[0]=0;
}
void sum(int k[],int p[])
{
    int i;
    for (i=1;i<=p[0];i++)
        k[i]+=p[i];
    k[0]=max(k[0],p[0])+1;
    for (i=1;i<=k[0];i++)
        if (k[i]>9) {
            k[i+1]++;
            k[i]-=10;
        }
    if (k[k[0]]==0)
        k[0]--;
}
void prod(int a[],int b[])
{
    int i,j;
    int c[nmax]={0};
    for (i=1;i<=a[0];i++)
        for (j=1;j<=b[0];j++)
            c[i+j-1]+=a[i]*b[j];
    for (i=1;i<=100;i++)
        if (c[i]>9) {
            c[i+1]+=c[i]/10;
            c[i]%=10;
        }
    c[0]=100;
    while (c[c[0]]==0)
        c[0]--;
    for (i=0;i<=100;i++)
        a[i]=c[i];
}
void putere(int put[],int mid[],int k)
{
    int i,j;
    int aux[nmax]={0};
    for (i=0;i<=mid[0];i++)
        aux[i]=mid[i];
    put[0]=put[1]=1;

    for (i=0;k;i++) {
        if (k&(1<<i)) {
            if (put[0]+aux[0]>n+5) {
                put[0]=n+1;
                break;
            }
            prod(put,aux);
            k^=(1<<i);
        }
        if (k&&aux[0]*2>n+5) {
            put[0]=n+1;
            break;
        }
        prod(aux,aux);
    }
}
void split(int a[],int k)
{
    for (int i=a[0];i>=2;i--) {
        a[i-1]+=(a[i]%k)*10;
        a[i]/=k;
    }
    a[1]/=k;
    if (a[a[0]]==0)
        a[0]--;
}
int comparing(int a[],int b[])
{
    if (a[0]<b[0])
        return -1;
    if (a[0]>b[0])
        return 1;
    int i=a[0];
    while (i>=1&&a[i]==b[i])
        i--;
    if (i==0)
        return 0;
    if (a[i]>b[i])
        return 1;
    if (a[i]<b[i])
        return -1;
}
int main()
{
    int i,j,b;
    freopen("numere2.in","r",stdin);
    freopen("numere2.out","w",stdout);
    scanf("%s",&s);
    for (i=0;s[i];i++,n++)
        v[i+1]=s[i]-'0';
    for (i=1,j=n;i<j;i++,j--)
        swap(v[i],v[j]);
    v[0]=n;
    for (b=33;b>=1;b--) {
        clearing(st);
        st[0]=st[1]=1;
        clearing(dr);
        dr[0]=n/b+2;
        dr[n/b+2]=1;
        while (comparing(st,dr)<0) {
            clearing(mid);
            sum(mid,st);
            sum(mid,dr);
            split(mid,2);
            clearing(put);
            putere(put,mid,b);
            if (comparing(put,v)<=0) {
                clearing(sol);
                sum(sol,mid);
                clearing(st);
                st[0]=st[1]=1;
                sum(st,mid);
            }
            else {
                clearing(dr);
                sum(dr,mid);
            }
        }
        clearing(put);
        putere(put,sol,b);
        if (comparing(put,v)==0) {
            for (i=sol[0];i>=1;i--)
                printf("%d",sol[i]);
            printf("\n%d\n",b);
            return 0;
        }
    }
    return 0;
}