Pagini recente » Cod sursa (job #2920392) | Cod sursa (job #1137248) | Cod sursa (job #1360959) | Cod sursa (job #536566) | Cod sursa (job #2516521)
#include <fstream>
using namespace std;
ifstream in("pavare2.in");
ofstream out("pavare2.out");
const int lim=105;
struct numar
{
int v[45];
}dp[lim][2*lim];
int alb[45];
int negru[45];
int rez[45];
int k[45];
inline void afis(int v[])
{
for(int i=v[0];i>=1;--i)
out<<v[i];
out<<'\n';
}
inline void cpy(int v[],int f[])
{
for(int i=v[0];i>=0;--i)
v[i]=0;
for(int i=f[0];i>=0;--i)
v[i]=f[i];
}
inline void adun(int a[],int b[],int sum[])
{
int aux,carry=0;
for(int i=1;i<=max(a[0],b[0]);++i)
{
aux=a[i]+b[i]+carry;
sum[i]=aux%10;
carry=aux/10;
}
sum[0]=max(a[0],b[0]);
if(carry!=0)
sum[0]++,sum[sum[0]]=carry;
for(int i=sum[0]+1;i<=44;++i)
sum[i]=0;
}
inline void makezero(int v[])
{
for(int i=0;i<=44;++i)
v[i]=0;
}
inline bool compar(int v[],int f[])
{
if(v[0]<f[0])
return 1;
if(v[0]>f[0])
return 0;
for(int i=1;i<=v[0];i++)
if(v[i]<f[i])
return 1;
return 0;
}
inline void scad(int a[],int b[],int c[])
{
int aux,carry=0;
for(int i=1;i<=a[0];++i)
{
aux=a[i]-carry-b[i];
if(aux<0)
c[i]=aux+10,carry=1;
else c[i]=aux,carry=0;
}
c[0]=a[0];
if(c[c[0]]==0)
--c[0];
}
int main()
{
ios_base::sync_with_stdio(false);
in.tie(0),out.tie(0);
int n,a,b;
in>>n>>a>>b;
char ch;
while(in>>ch)
k[++k[0]]=ch-'0';
dp[1][1].v[0]=dp[1][1].v[1]=1;
dp[1][a+1].v[0]=dp[1][a+1].v[1]=1;
for(int i=2;i<=n;++i)
{
makezero(alb);
makezero(negru);
for(int j=1;j<=a;++j)
adun(alb,dp[i-1][j].v,alb);
for(int j=a+1;j<=a+b;++j)
adun(negru,dp[i-1][j].v,negru);
for(int j=2;j<=a;++j)
cpy(dp[i][j].v,dp[i-1][j-1].v);
cpy(dp[i][1].v,negru);
for(int j=a+2;j<=a+b;++j)
cpy(dp[i][j].v,dp[i-1][j-1].v);
cpy(dp[i][a+1].v,alb);
}
for(int i=1;i<=a+b;++i)
adun(rez,dp[n][i].v,rez);
afis(rez);
if(k[0]==1 and k[1]==1)
{
for(int i=1;i<=n;++i)
if(i%(a+1)==0)
out<<1;
else out<<0;
return 0;
}
string pavare="";
int lastalbe=0,lastnegre=0;
for(int i=1;i<=n;++i)
{
makezero(rez);
if((0<lastnegre and lastnegre<=b-1) or (lastnegre==0 and lastalbe<=a-1))
{
lastalbe++;
for(int j=1;j<=a-lastalbe;++j)
adun(rez,dp[n-i][j].v,rez);
for(int j=a+1;j<=a+b;++j)
adun(rez,dp[n-i][j].v,rez);
if(compar(rez,k)==1)
pavare+='1',lastnegre=1,lastalbe=0,scad(k,rez,k);
else pavare+='0';
}
else if(lastnegre==0 and lastalbe==a)
{
pavare+='1';
lastnegre=1;
lastalbe=0;
}
else if(lastnegre==b)
{
pavare+='0';
lastnegre=0;
lastalbe=1;
}
}
out<<pavare;
return 0;
}