Cod sursa(job #1995267)

Utilizator Mircea_DonciuDonciu Mircea Mircea_Donciu Data 27 iunie 2017 14:22:43
Problema Pavare2 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.48 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");
}