Cod sursa(job #1010857)

Utilizator RaduGabriel2012Dinu Radu RaduGabriel2012 Data 15 octombrie 2013 20:27:56
Problema Pavare2 Scor 35
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.89 kb
#include <iostream>
#include <fstream>
#include <cstring>
using namespace std;
ifstream f("pavare2.in");
ofstream g("pavare2.out");
int a[105][105][35],b[105][105][35],sa[105][35],sb[105][35],nr[35],scad[35],k[35];
int n,x,y;
void Atrib(int v[],int x)
{ v[0]=0;
   while(x) {v[0]++; v[v[0]]=x%10; x/=10;}
}
void AtribV(int v1[],int v2[])
{ int i;
   v1[0]=v2[0];
   for(i=1;i<=v2[0];i++)
    v1[i]=v2[i];
}
void Adun(int v1[],int v2[])
{ int i,t=0;
 if (v1[0]>v2[0])
  {for(i=v2[0]+1;i<=v1[0];i++) v2[i]=0; v2[0]=v1[0];}
 else
  {for(i=v1[0]+1;i<=v2[0];i++) v1[i]=0; v1[0]=v2[0];}

 for(i=1;i<=v1[0];i++)
 { t+=v1[i]+v2[i];
   v1[i]=t%10; t/=10;
 }
  if (t) {v1[0]++; v1[v1[0]]=t;}
}

void Subtract(int v1[],int v2[])
{ int i,t;
  if (v1[0]>v2[0])
  {for(i=v2[0]+1;i<=v1[0];i++) v2[i]=0; v2[0]=v1[0];}
 else
  {for(i=v1[0]+1;i<=v2[0];i++) v1[i]=0; v1[0]=v2[0];}
    t=0;
   for(i=1;i<=v1[0];i++)
   { if (t) {v1[i]--; if (v1[i]<0) {v1[i]=9; t=2;} else t=0; }
      if (v1[i]<v2[i]) {v1[i]=v1[i]-v2[i]+10; t=1;}
        else {v1[i]-=v2[i]; if (t!=2) t=0; }
   }
while(!v1[v1[0]] && v1[0]) v1[0]--;
}
int Comp(int v1[],int v2[])
{ int i;
   if (v1[0]>v2[0]) return 1;
   if (v1[0]<v2[0]) return 0;
  for(i=v1[0];i>=1;i--)
   { if (v1[i]>v2[i]) return 1;
     if (v1[i]<v2[i]) return 0; }
return 1;
}

void Afis(int v[])
{ int i;
  for(i=v[0];i>0;i--)
   cout<<v[i];
   cout<<"\n";
}

void Dinamic()
{ int i,j;
   Atrib(a[1][1],1);
   Atrib(sa[1],1);
   Atrib(b[1][1],1);
   Atrib(sb[1],1);
    for(i=2;i<=n;i++)
     { if (i<=x) {Atrib(a[i][x],1); Atrib(sa[i],1);}
       if (i<=y) {Atrib(b[i][y],1); Atrib(sb[i],1);}
        for(j=1;j<=min(x,i-1);j++)
          {AtribV(a[i][j],sb[i-j]);Adun(sa[i],a[i][j]);}

        for(j=1;j<=min(y,i-1);j++)
          {AtribV(b[i][j],sa[i-j]); Adun(sb[i],b[i][j]);}

     }
      Adun(sa[n],sb[n]);
       for(i=sa[n][0];i>=1;i--) g<<sa[n][i];
        g<<"\n";
}

void Reconstruct()
{ int i,j,len,ok=0,semn=0;
   len=n;  semn=0;
  while(len)
  { ok=0; Atrib(scad,0); Atrib(nr,0);
     if (!semn || semn==1)
    for(i=x;i>=1;i--)
    { Adun(nr,a[len][i]);
      if (Comp(nr,k)) {ok=1; len-=i; for(j=1;j<=i;j++) g<<"0"; semn=2; break; }
       else Adun(scad,a[len][i]);
    }

    if (!ok && (!semn || semn==2))
    {
      for(i=1;i<=y;i++)
      { Adun(nr,b[len][i]);
      if (Comp(nr,k)) {ok=1; len-=i; for(j=1;j<=i;j++) g<<"1"; semn=1; break;}
       else Adun(scad,b[len][i]);
       }
    }

     Subtract(k,scad);

  }
}
int main()
{ int i,j; char sir[35];
    f>>n>>x>>y; f>>sir; //cout<<sir;
      k[0]=strlen(sir);
     for(i=0;i<strlen(sir);i++)
      k[k[0]-i]=sir[i]-48;
      // Afis(k);
     Dinamic();
     Reconstruct();

     //cout<<a[3][2];
      //int nr1[35],nr2[35];
       //Atrib(nr1,70); Atrib(nr2,15);
        //Subtract(nr1,nr2);
        // Afis(nr1);
    return 0;
}