Cod sursa(job #983154)
Utilizator | Data | 10 august 2013 23:05:28 | |
---|---|---|---|
Problema | Pavare2 | Scor | 100 |
Compilator | cpp | Status | done |
Runda | Arhiva de probleme | Marime | 3.35 kb |
#include<stdio.h>
#include<string.h>
typedef short lnum[300];
const int maxn = 130;
lnum a[maxn][maxn][3];
int nr[maxn];
int i;
int k;
int j;
lnum k2;
short ans[maxn];
int l;
lnum sum;
char k4[maxn];
int n;
void scadere(lnum &A,lnum &B)
{
int i, t = 0;
for (i = 1; i <= A[0]; i++)
{
A[i] -= B[i] ;
A[i] -= t;
if (A[i]<0)
{
A[i]+=10;
t=1;
}
else t=0;
}
for (; A[0] > 1 && !A[A[0]]; A[0]--);
}
bool cmp(lnum &a,lnum &b)
{
if (a[0]!=b[0]) return a[0]<b[0];
for(i=a[0];i>0;i--)
{
if (a[i]!=b[i]) return a[i]<b[i];
}
return false;
}
void ad(lnum &a,lnum &b,lnum &c)
{
int t=0;
int i;
for(i=1;i<=b[0]||i<=c[0]||t;i++)
{
t+=b[i]+c[i];
a[i]=t%10;
t/=10;
}
i--;
a[0]=i;
}
int main()
{
freopen("pavare2.in","r",stdin);
freopen("pavare2.out","w",stdout);
scanf("%d %d %d %s",&n,&nr[0],&nr[1],&k4);
int k3=strlen(k4)-1;
int p=1;
while(k3>=0)
{
k2[0]++;
k2[k2[0]]=(k4[k3]-'0');
k3--;
}
a[1][1][0][0]=1;
a[1][1][0][1]=1;
a[1][1][1][0]=1;
a[1][1][1][1]=1;
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
for(k=0;k<=1;k++)
{
if (j+1<=nr[k]) ad(a[i+1][j+1][k],a[i+1][j+1][k],a[i][j][k]);
ad(a[i+1][1][k^1],a[i+1][1][k^1],a[i][j][k]);
}
}
for(i=1;i<=n;i++)
for(k=0;k<=1;k++)
ad(sum,sum,a[n][i][k]);
for(i=sum[0];i>0;i--)
printf("%d",sum[i]);
printf("\n");
int i1;
i1=n;
short aux=0,aux2=0;
int nr2=0;
while(i1)
{
if (aux==0) aux2=nr2;
else aux2=0;
for(i=1;i<=sum[0];i++)
sum[i]=0;
sum[0]=0;
for(i=1;i<=nr[0]-aux2;i++)
ad(sum,sum,a[i1][i][0]);
if (cmp(sum,k2))
{
l++;
if (aux==0) nr2=0;
aux=1;
nr2++;
ans[l]=1;
scadere(k2,sum);
}
else
{
l++;
if (aux==1) nr2=0;
aux=0;
nr2++;
ans[l]=0;
}
i1--;
}
for(i=1;i<=l;i++)
printf("%d",ans[i]);
printf("\n");
return 0;
}