Cod sursa(job #1010840)

Utilizator RaduGabriel2012Dinu Radu RaduGabriel2012 Data 15 octombrie 2013 19:52:08
Problema Pavare2 Scor 45
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.29 kb
#include <iostream>
#include <fstream>
using namespace std;
ifstream f("pavare2.in");
ofstream g("pavare2.out");
long long k,a[105][105],b[105][105],sa[105],sb[105];
int n,x,y;
void Dinamic()
{ int i,j;
   a[1][1]=1; sa[1]=1;
   b[1][1]=1; sb[1]=1;
    for(i=2;i<=n;i++)
     { if (i<=x) {a[i][x]=1; sa[i]=1;}
       if (i<=y) {b[i][y]=1; sb[i]=1;}
        for(j=1;j<=min(x,i-1);j++)
          {a[i][j]=1LL*sb[i-j]; sa[i]+=1LL*a[i][j];}

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

     }
    g<<(long long) sa[n]+sb[n]<<"\n";

}
void Reconstruct()
{ long long i,j,len,nr=0,ok=0,scad,semn=0;
   len=n;  semn=0;
  while(len)
  { ok=0; scad=0; nr=0;
     if (!semn || semn==1)
    for(i=x;i>=1;i--)
    { nr+=a[len][i];
      if (nr>=k) {ok=1; len-=i; for(j=1;j<=i;j++) g<<"0"; semn=2; break; }
       else scad+=a[len][i];
    }
      //cout<<scad<<"\n";
    if (!ok && (!semn || semn==2))
    {
      for(i=1;i<=y;i++)
      { nr+=b[len][i];
      if (nr>=k) {ok=1; len-=i; for(j=1;j<=i;j++) g<<"1"; semn=1; break;}
       else scad+=b[len][i];
       }
    }

     k-=scad;
     //cout<<scad<<"\n";
  }
}
int main()
{ int i,j;
    f>>n>>x>>y>>k;

     Dinamic();
     Reconstruct();
     //cout<<a[3][2];
    return 0;
}