Cod sursa(job #2490482)

Utilizator betybety bety bety Data 10 noiembrie 2019 13:11:56
Problema Pavare2 Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.67 kb
#include<cstdio>

#include<cstring>



using namespace std;



const char iname[] = "pavare2.in";

const char oname[] = "pavare2.out";

const int maxn = 105;

const int maxl = 25;

const int mod10 = 100000000;

const int base10 = 8;



int a, b, n;



void add(int A[], int B[])

{

      int i, t = 0;

      for (i=1; i<=A[0] || i<=B[0] || t; i++, t/=mod10)

              A[i] = (t += A[i] + B[i]) % mod10;

      A[0] = i - 1;

}



void sub(int A[], int B[])

{

      int i, t = 0;

      for (i = 1; i <= A[0]; i++)

              A[i] += (t = (A[i] -= ((i <= B[0]) ? B[i] : 0) + t) < 0) * mod10;

      for (; A[0] > 1 && !A[A[0]]; A[0]--);

}



bool cmp(int A[], int B[]) {

    if (A[0] != B[0])

        return A[0] < B[0];

    for (int i = A[0]; i > 0; --i)

        if (A[i] != B[i])

            return A[i] < B[i];

    return false;

}



char s[maxn];

int W[maxn][maxl], B[maxn][maxl], k[maxl], start;

int i, j;



inline int max(const int &a, const int &b) {

    if (a < b)

        return b;

    return a;

}



int main() {

    freopen(iname, "r", stdin);

    freopen(oname, "w", stdout);



    scanf("%d%d%d\n", &n, &a, &b);

    fgets(s, sizeof(s), stdin);

    for (i = 0; s[i] != 0 && s[i] != '\n'; ++i);

    for (--i; i >= 0; i -= base10) {

        k[++k[0]] = 0;

        for (j = max(i - base10 + 1, 0); j <= i; ++j)

            k[k[0]] = k[k[0]] * 10 + s[j] - '0';

    }

    W[0][0] = W[0][1] = 1;

    B[0][0] = B[0][1] = 1;

    for (i = 1; i <= n; ++i) {

        memset(W[i], 0, sizeof(W[i]));

        memset(B[i], 0, sizeof(B[i]));

        for (j = max(i - b, 0); j < i; ++j)

            add(B[i], W[j]);

        for (j = max(i - a, 0); j < i; ++j)

            add(W[i], B[j]);

    }

    memset(W[n + 1], 0, sizeof(W[n + 1]));

    add(W[n + 1], W[n]);

    add(W[n + 1], B[n]);

    printf("%d", W[n + 1][W[n + 1][0]]);

    for (i = W[n + 1][0] - 1; i > 0; --i)

        printf("%08d", W[n + 1][i]);

    printf("\n");

    if (cmp(W[n], k))

        sub(k, W[n]), start = 1;

    else

        start = 0;

    i = n;

    while (i > 0) {

        if (start == 0) {

            for (j = max(i - a, 0); j < i && cmp(B[j], k); ++j)

                sub(k, B[j]);

            while (i > j)

                printf("0"), --i;

            start = 1;

            continue;

        }

        for (j = i - 1; j >= 0 && j > i - b && cmp(W[j], k); --j)

            sub(k, W[j]);

        while (i > j)

            printf("1"), --i;

        start = 0;

    }

    printf("\n");

}