Pagini recente » Cod sursa (job #683032) | Cod sursa (job #2226104) | Cod sursa (job #1108343) | Cod sursa (job #1933131) | Cod sursa (job #1244242)
#include<fstream>
#include<cstring>
using namespace std;
ifstream f("pavare2.in"); ofstream g("pavare2.out");
int n,A,B,K[35];
int alb[110][110][35], neg[110][110][35], sol[35];
inline void Add(int A[], int B[])
{ int i,t=0;
for(i=1;i<=A[0]||i<=B[0]||t;++i,t/=10) A[i]=(t+=A[i]+B[i])%10;
A[0]=i-1;
}
inline void Scad(int A[], int B[])
{ int i,t=0;
for(i=1;i<=A[0];++i)
{ if(i<=B[0]) A[i]=A[i]-B[i]-t; else A[i]=A[i]-t;
if(A[i]<0) {t=1; A[i]+=10;} else t=0;
}
while(A[0]>1 && A[A[0]]==0) A[0]--;
}
inline int Compara(int A[], int B[])
{ if(A[0]<B[0]) return -1;
if(A[0]>B[0]) return 1;
for(int i=A[0];i;--i)
{ if(A[i]<B[i]) return -1;
if(A[i]>B[i]) return 1;
}
return 0;
}
int main()
{ int i,j,lim,ns,last,nr;
char s[35];
f>>n>>A>>B;
f>>(s+1);
ns=strlen(s+1);
for(i=1;i<=ns;++i) K[i]=s[ns-i+1]-'0';
K[0]=ns;
for(i=1;i<=A;++i) alb[n+1][i][0]=alb[n+1][i][1]=1;
for(i=1;i<=B;++i) neg[n+1][i][0]=neg[n+1][i][1]=1;
for(i=n;i;--i)
{ lim=min(n,i+A-1);
for(j=i;j<=lim;++j) Add(alb[i][j-i+1],neg[j+1][B]);
for(j=2;j<=A;++j) Add(alb[i][j],alb[i][j-1]);
lim=min(n,i+B-1);
for(j=i;j<=lim;++j) Add(neg[i][j-i+1],alb[j+1][A]);
for(j=2;j<=B;++j) Add(neg[i][j],neg[i][j-1]);
}
Add(sol,alb[1][A]); Add(sol,neg[1][B]);
for(i=sol[0];i;--i) g<<sol[i];
g<<"\n";
if(Compara(K,alb[1][A])<=0) {g<<"0"; last=0; nr=1;} else {Scad(K,alb[1][A]); g<<"1"; last=nr=1;}
for(i=2;i<=n;++i)
{ if(last==0 && nr==A) {g<<"1"; last=nr=1; continue;}
if(last==1 && nr==B) {g<<"0"; last=0; nr=1; continue;}
if(last==0)
{ if(Compara(K,alb[i][A-nr])<=0) {g<<"0"; nr++;}
else {Scad(K,alb[i][A-nr]); g<<"1"; last=nr=1;}
}
else
{ if(Compara(K,alb[i][A])<=0) {g<<"0"; last = 0; nr = 1;}
else {Scad(K, alb[i][A]); g<<"1"; nr++;}
}
}
g<<"\n"; g.close(); return 0;
}