Cod sursa(job #8804)

Utilizator mariusdrgdragus marius mariusdrg Data 25 ianuarie 2007 17:21:43
Problema Pavare2 Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.54 kb
#include<stdio.h>


typedef int lnum[100];

const int maxn = 101;


lnum a[maxn][maxn][3];
int nr[maxn];
int i;
int j;
int k;
lnum k2;
lnum sum;
int n;


void scadere(lnum &a,lnum &b,lnum &c)
{
        int i;
        int last;
        for(i=b[0];i>0;i--)
        {
                a[i]=b[i]-c[i];
                if (a[i]<0)
                {
                        a[last]--;
                        a[i]+=10;
                }
                if (a[i]>0) last=i;
        }
        a[0]=b[0];
        while(a[a[0]]==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 true;

}


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 %d",&n,&nr[0],&nr[1],&k);
        while(k)
        {
                k2[0]++;
                k2[k2[0]]=k%10;
                k/=10;
        }
        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;
        while(i1)
        {
                for(i=1;i<=sum[0];i++)
                        sum[i]=0;
                sum[0]=0;
                for(i=1;i<=n;i++)
                        ad(sum,sum,a[i1][i][0]);
                if (cmp(sum,k2))
                {
                        printf("1");
                        scadere(k2,k2,sum);
                }
                else
                {
                        printf("0");
                }

                i1--;
        }
        printf("\n");

        return 0;

}