Cod sursa(job #2549239)

Utilizator ivddabDabelea Ioana-Viviana ivddab Data 17 februarie 2020 14:42:05
Problema Numere 2 Scor 50
Compilator cpp-64 Status done
Runda antrenament_oji2020 Marime 2.97 kb
#include <fstream>

using namespace std;
ifstream f("numere2.in");
ofstream g("numere2.out");
int i,j,nrB;
char cf;
struct vectr{
  int v[1002];
};
vectr a,b;
vectr zero( ){
  vectr d;
  for(int i=0;i<=102;i++) d.v[i]=0;
  return d;
}
int compar ( vectr a, vectr b ){
  if(a.v[0]!=b.v[0]) return a.v[0]<b.v[0];
  int i=a.v[0];
  while(a.v[i]==b.v[i]&&i>=1) i--;
  if(i==0) return 2;
  if(a.v[i]<b.v[i]) return 1;
  return 0;
}
vectr inmultire( vectr a, vectr b ){
   //c=a*b
   //a>=b
   vectr c;
   int t;
   c=zero();
   for(int i=1;i<=b.v[0];i++){
     for(int j=1;j<=a.v[0];j++){
       if(j+i-1>c.v[0]) c.v[0]=j+i-1;
       c.v[j+i-1]+=(a.v[j]*b.v[i]+t);
       t=c.v[j+i-1]/10; c.v[j+i-1]%=10;
     }
     while(t!=0){
     c.v[++c.v[0]]=t%10; t/=10;
     }
   }
   return c;
}
vectr ridput(vectr a,int n){
  vectr c;
  c=zero(); c.v[0]=c.v[1]=1;
  while(n!=0){
    if(n%2==1) {
      if(compar(c,a)!=0)  c=inmultire(a,c);
        else              c=inmultire(c,a);
      n--;
    }
    a=inmultire(a,a); n/=2;
  }
  return c;
}
vectr scad1(vectr a){
   int t=0,i;
   vectr c;
   c=zero();
   c.v[++c.v[0]]=a.v[1]-1;
   if(c.v[1]<0) {
      c.v[1]=9; t=1;
   }
   i=2;
   while(i<=a.v[0]){
     c.v[++c.v[0]]=a.v[i]-t;
     if(c.v[i]<0) {
      c.v[i]=9; t=1;
     } else t=0;
     i++;
   }
   while(c.v[c.v[0]]==0) c.v[0]--;
   return c;
}
vectr adun( vectr a, vectr b ){
  //a>=b
  vectr c;
  int t=0;
  c=zero();
  c.v[0]=a.v[0];
  for(int i=1;i<=b.v[0];i++) {
    c.v[i]=b.v[i]+a.v[i]+t;
    t=c.v[i]/10; c.v[i]%=10;
  }
  for(int i=b.v[0]+1;i<=a.v[0];i++){
    c.v[i]=a.v[i]+t;
    t=c.v[i]/10; c.v[i]%=10;
  }
  while(t!=0){
    c.v[++c.v[0]]=t%10; t/=10;
  }
  return c;
}
vectr mijloc( vectr a, vectr b ){
  // c=(a+b)/2;
  // a>=b
  int nr;
  vectr c;
  c=adun(a,b);
  vectr d;
  d=zero();
  int i=c.v[0];
  nr=0;
  while(i>=1){
    nr=nr*10+c.v[i];
    d.v[++d.v[0]]=nr/2;
    nr%=2; i--;
  }
  c.v[0]=0;
  for(i=d.v[0];i>=1;i--) c.v[++c.v[0]]=d.v[i];
  while(c.v[c.v[0]]==0) c.v[0]--;
  return c;
}
vectr cautA( vectr t){
  int i=1,ok=1;
  vectr st,dr,mijl;
  vectr d,c,rasp,b;
  while(ok==1){
     st=zero(); dr=t;
     st.v[0]=st.v[1]=1;
     int ex=0;
     while(compar(st,dr)!=0){
        mijl=mijloc(dr,st);
        c=ridput(mijl,i);
        int x=0;
        x=compar(c,t);
        if(x!=0){
            if(x==2){ rasp=mijl; ex=1; nrB=i; }
            d=zero(); d.v[0]=d.v[1]=1;
            st=adun(mijl,d);
        } else dr=scad1(mijl);
     }
     b=ridput(st,i);
     if(compar(b,t)==2) { rasp=mijl; ex=1; nrB=i; }
     if(ex==0){
        d.v[0]=1; d.v[1]=2;
        if(compar(st,d)==2) ok=0;
     }
     i++;
  }
  return rasp;
}
int main()
{
    while(f>>cf) a.v[++a.v[0]]=cf-'0';
    for(i=a.v[0];i>=1;i--) b.v[++b.v[0]]=a.v[i];
    a=b; //a.v[0]=1; a.v[1]=4;
    b=cautA(a);
    for(i=b.v[0];i>=1;i--) g<<b.v[i];
    g<<'\n';
    g<<nrB<<'\n';
    return 0;
}