Cod sursa(job #51146)

Utilizator fireatmyselfBogdan-Alexandru Stoica fireatmyself Data 10 aprilie 2007 12:43:48
Problema Pavare2 Scor 100
Compilator c Status done
Runda Arhiva de probleme Marime 4.44 kb
#include <stdio.h>
#include <string.h>
#define NMAX 111
#define CMAX 69
#define BAZA 10
#define min(a, b) ((a) < (b) ? (a):(b))

int V[2][NMAX][NMAX][CMAX], A, B, N, K[CMAX];
int s[CMAX];

int comp(int n, int m)
{
        int l1 = CMAX-1, l2 = CMAX-1;

        while (K[l1] == 0 && l1 > 0) l1--;
        while (V[n][N][m][l2] == 0 && l2 > 0) l2--;

        if (l1 > l2) return 1;
        if (l1 == l2)
        {
                while (K[l1] == V[n][N][m][l1] && l1 > 0) l1--;
                if (K[l1] > V[n][N][m][l1]) return 1;
        }
        return 0;
}

int main()
{
        int i, j, k, a = 0, n = 0;
        char str[4*CMAX];

        freopen("pavare2.in", "r", stdin);
        scanf("%d %d %d", &N, &A, &B);
        scanf(" %s", str);

        for (i = 0; i < strlen(str); i++) K[n++] = str[i]-48;

        for (i = 0; i < n/2; i++)
            k = K[i], K[i] = K[n-i-1], K[n-i-1] = k;

        V[0][1][0][0] = V[0][1][1][0] = V[1][1][0][0] = V[1][1][1][0] = 1;

        for (i = 2; i <= N; i++)
        {
                for (j = 1; j <= min(i, A); j++)
                {
                    for (k = 0; k < CMAX; k++) V[0][i][j][k] = V[0][i-1][j-1][k];
                    for (k = 0; k < CMAX; k++)
                        if (V[0][i][j][k] >= BAZA)
                           V[0][i][j][k+1] += (V[0][i][j][k]/BAZA), V[0][i][j][k] %= BAZA;
                }
                
                for (j = 1; j <= min(i, B); j++)
                {
                        for (k = 0; k < CMAX; k++) V[1][i][j][k] = V[1][i-1][j-1][k];
                        for (k = 0; k < CMAX; k++)
                            if (V[1][i][j][k] >= BAZA)
                               V[1][i][j][k+1] += (V[1][i][j][k]/BAZA), V[1][i][j][k] %= BAZA;
                }
                
                for (j = 1; j <= min(i, B); j++)
                {
                    for (k = 0; k < CMAX; k++) V[0][i][0][k] += V[1][i][j][k];
                    for (k = 0; k < CMAX; k++)
                        if (V[0][i][0][k] >= BAZA)
                           V[0][i][0][k+1] += (V[1][i][0][k]/BAZA), V[1][i][0][k] %= BAZA;
                }
                
                for (j = 1; j <= min(i, A); j++)
                {
                        for (k = 0; k < CMAX; k++) V[1][i][0][k] += V[0][i][j][k];
                        for (k = 0; k < CMAX; k++)
                            if (V[1][i][0][k] >= BAZA)
                               V[1][i][0][k+1] += (V[1][i][0][k]/BAZA), V[1][i][0][k] %= BAZA;
                }
        }

        for (i = 1; i <= A; i++)
        {
            for (k = 0; k < CMAX; k++) s[k] += V[0][N][i][k];
            for (k = 0; k < CMAX; k++)
                if (s[k] >= BAZA)
                   s[k+1] += (s[k]/BAZA), s[k] %= BAZA;
        }
        for (i = 1; i <= B; i++)
        {
            for (k = 0; k < CMAX; k++) s[k] += V[1][N][i][k];
            for (k = 0; k < CMAX; k++)
                if (s[k] >= BAZA)
                   s[k+1] += (s[k]/BAZA), s[k] %= BAZA;
        }

        freopen("pavare2.out", "w", stdout);
        j = CMAX-1;
        while (s[j] == 0) j--;
        for (; j >= 0; j--) printf("%d", s[j]);
        printf("\n");

        while (N)
        {
                for (j = A; j > 0; j--)
                    if (comp(0, j))
                    {
                       for (k = 0; k < CMAX; k++) K[k] -= V[0][N][j][k];
                       for (k = 0; k < CMAX; k++)
                       {
                           if (K[k] < 0)
                              K[k] += BAZA, K[k+1]--;
                       }

                    }
                    else
                    {
                        for (i = 0; i < j; i++) printf("0");
                        N -= j;
                        break;
                    }
                    
                for (j = 1; j <= B; j++)
                    if (comp(1, j))
                    {
                       for (k = 0; k < CMAX; k++) K[k] -= V[1][N][j][k];
                       for (k = 0; k < CMAX; k++)
                           if (K[k] < 0)
                              K[k] += BAZA, K[k+1]--;
                    }
                    else
                    {
                        for (i = 0; i < j; i++) printf("1");
                        N -= j;
                        break;
                    }
        }
        printf("\n");

        return 0;
        
}