Cod sursa(job #8869)

Utilizator mariusdrgdragus marius mariusdrg Data 25 ianuarie 2007 21:03:18
Problema Pavare2 Scor 65
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.47 kb
#include<stdio.h>
#include<string.h>


typedef short lnum[50];

const int maxn = 102;


lnum a[maxn][maxn][2];
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]+=1000;
                                        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%1000;
                t/=1000;
        }
        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;
        k2[0]=1;
        while(k3>=0)
        {
                if (p>100)
                {
                        k2[0]++;
                        p=1;

                }
                k2[k2[0]]+=p*(k4[k3]-'0');
                p*=10;
                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--;
        }
  //      if (k2[1]!=0)   ans[l]=1;
        for(i=1;i<=l;i++)
                printf("%d",ans[i]);
        printf("\n");

        return 0;

}