Cod sursa(job #1441039)

Utilizator liisLIIS-Horia-Vlad-Denis liis Data 23 mai 2015 15:05:24
Problema A+B Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 4.72 kb
#include <fstream>

using namespace std;
ifstream fin("largestroot.in");
ofstream fout("largestroot.out");
int n;
struct coef{int lg,cif[1000];};
coef c[23],power,sum;
void intorc(coef &c)
{
    int aux;
    for(int i=1;i<=c.lg/2;i++)
    {
        aux=c.cif[i];
        c.cif[i]=c.cif[c.lg-i+1];
        c.cif[c.lg-i+1]=aux;
    }
}
void citire(coef &c)
{
    char ch;
    c.lg=0;
    fin.get(ch);
    if(ch=='-')
    {
        c.cif[0]=0;
        fin.get(ch);
    }
    else
        c.cif[0]=1;
    while(ch!='\n')
    {
        c.cif[++c.lg]=ch-'0';
        fin.get(ch);
    }
    intorc(c);
}
int compar(coef a,coef b)
{
    if(a.lg>b.lg)
        return 1;
    else
        if(a.lg<b.lg)
            return -1;
        else
            for(int i=1;i<=a.lg;i++)
                if(a.cif[i]>b.cif[i])
                    return 1;
                else
                    if(a.cif[i]<b.cif[i])
                        return -1;
    return 0;
}
void adun(coef &a,coef b)
{
    long long t=0,i;
    if(a.lg>=b.lg)
    {
        for(i=1;i<=b.lg;i++)
        {
            a.cif[i]+=b.cif[i]+t;
            t=a.cif[i]/10;
            a.cif[i]=a.cif[i]%10;
        }
        while(t!=0 && i<=a.lg)
        {
            a.cif[i]+=t;
            t=a.cif[i]/10;
            a.cif[i]=a.cif[i]%10;
            i++;
        }
        while(t!=0)
            a.cif[++a.lg]=t%10,t=t/10;
    }
    else
    {
        for(i=1;i<=a.lg;i++)
        {
            a.cif[i]+=b.cif[i]+t;
            t=a.cif[i]/10;
            a.cif[i]=a.cif[i]%10;
        }
        for(;i<=b.lg;i++)
        {
            a.cif[i]=t+b.cif[i];
            t=a.cif[i]/10;
            a.cif[i]=a.cif[i]%10;
        }
        a.lg=b.lg;
        while(t!=0)
            a.cif[++a.lg]=t%10,t=t/10;
    }
}
void scad1(coef &a,coef b)
{
    for(int i=1;i<=b.lg;i++)
    {
        if(a.cif[i]<b.cif[i]) a.cif[i+1]--,a.cif[i]+=10;
        a.cif[i]-=b.cif[i];
    }
    while(a.cif[a.lg]==0 && a.lg>1) a.lg--;
}
void scad2(coef a,coef &b)
{
    coef rez;
    rez.lg=a.lg;
    for(int i=0;i<=a.lg;i++)
        rez.cif[i]=a.cif[i];
    for(int i=1;i<=b.lg;i++)
    {
        if(rez.cif[i]<rez.cif[i]) rez.cif[i+1]--,rez.cif[i]+=10;
        rez.cif[i]=rez.cif[i]-b.cif[i];
    }
    while(rez.cif[rez.lg]==0 && rez.lg>1) rez.lg--;
    for(int i=0;i<=rez.lg;i++)
        b.cif[i]=rez.cif[i];
    b.lg=rez.lg;
}
void suma(coef &a,coef b)
{
    if(a.cif[0]==b.cif[0])
        adun(a,b); // retin in a
    else
    {
        int d = compar(a,b);
        if(d==0) // a==b
            a.lg=1,a.cif[0]=1;
        else
            if(d==1) // a>b
                scad1(a,b);  // retin in primul
            else
                scad2(b,a);  // retin in al doilea
    }
}
void produs(coef &a,int val)
{
    // val >0
    int t=0;
    for(int i=1;i<=a.lg;i++)
    {
        t=(long long)a.cif[i]*val+t;
        a.cif[i]=t%10;
        t=t/10;
    }
    while(t!=0)
        a.cif[++a.lg]=t%10,t=t/10;
}
coef produs3(coef a,int val)
{
    // val >0
    int t=0;
    for(int i=1;i<=a.lg;i++)
    {
        t=(long long)a.cif[i]*val+t;
        a.cif[i]=t%10;
        t=t/10;
    }
    while(t!=0)
        a.cif[++a.lg]=t%10,t=t/10;
    return a;
}
coef produs2(coef a,int val)
{
    coef CA;
    CA.lg=a.lg;
    for(int i=0;i<=a.lg;i++)
        CA.cif[i]=a.cif[i];
    int t=0;
    for(int i=1;i<=CA.lg;i++)
    {
        t=(long long)CA.cif[i]*val+t;
        CA.cif[i]=t%10;
        t=t/10;
    }
    while(t!=0)
        CA.cif[++CA.lg]=t%10,t=t/10;
    return CA;
}
coef produs(coef a,coef b)
{
    coef CA;
    CA.lg=a.lg;
    for(int i=0;i<=a.lg;i++)
        CA.cif[i]=a.cif[i];
    long long t=0;
    for(int i=1;i<=b.lg;i++)
    {
        if(b.cif[i]!=0)
            adun(a,produs2(CA,b.cif[i]));
        produs(CA,10);
    }
    if(CA.cif[0]==b.cif[0])
        a.cif[0]=1;
    else
        a.cif[0]=0;
}
int expresie(int root)
{
    sum.cif[1]=0; sum.lg=1; sum.cif[0]=1;
    power.lg=1; power.cif[1]=1; power.cif[0]=1;
    for(int i=0;i<=n-1;i++)
    {
        suma(sum,produs3(power,c[i]));
        produs(power,root);
    }
    suma(sum,power);
    if(sum.lg==1 && sum.cif[1]==0)
        return 0;
    else
        if(sum.cif[0]==1)
            return 1;
        else
            return -1;
}
int caut()
{
    int ok;
    for(int i=100;i>=1;i--)
        if(expresie(i)==0)
            return i;
    return 0;
}
int main()
{
    int t;
    fin>>t;
    for(int i=1;i<=t;i++)
    {
        fin>>n;
        fin.get();
        for(int i=n-1;i>=0;i--)
        {
            citire(c[i]);
        }
        fout << caut()<<'\n';
    }
    return 0;
}