Pagini recente » Cod sursa (job #3162695) | Cod sursa (job #844094) | Cod sursa (job #1138906) | infoarena - comunitate informatica, concursuri de programare | Cod sursa (job #1441039)
#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;
}