Cod sursa(job #1473274)

Utilizator akaprosAna Kapros akapros Data 18 august 2015 22:33:04
Problema Pavare2 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.81 kb
#include <cstdio>
#include <cstring>
#include <algorithm>
#define maxN 102
#define ct 9
#define maxL 102
using namespace std;
int n, a, b, i, j, dp[maxN][maxN][2][maxL], s[maxN][2][maxL];
int v[maxL], k[maxL], sol[maxN];
char S[maxL];
int comp(int A[], int B[])
{
    int i;
    if (A[0] < B[0])
        return -1;
    if (A[0] > B[0])
        return 1;
    for (i = A[0]; i >= 1; -- i)
        if (A[i] < B[i])
           return -1;
        else
            if (A[i] > B[i])
                return 1;
    return 0;
}
void add(int A[], int B[])
{
      int i, t = 0;
      for (i = 1; i <= A[0] || i <= B[0] || t; i++, t /= 10)
              A[i] = (t += A[i] + B[i]) % 10;
      A[0] = i - 1;
}
void sub(int A[], int B[])
{
      int i, t = 0;
      for (i = 1; i <= A[0]; i++) {
              A[i] -= ((i <= B[0]) ? B[i] : 0) + t;
              A[i] += (t = A[i] < 0) * 10;
      }
      for (; A[0] > 1 && !A[A[0]]; A[0]--);
}
void read()
{
    freopen("pavare2.in", "r", stdin);
    scanf("%d %d %d\n", &n, &a, &b);
    gets(S);
}
void solve()
{
    dp[0][0][0][0] = 1;
    dp[0][0][0][1] = 1;
    dp[0][0][1][0] = 1;
    dp[0][0][1][1] = 1;
    s[0][0][0] = 1;
    s[0][0][1] = 1;
    s[0][1][0] = 1;
    s[0][1][1] = 1;
    for (i = 1; i <= n; ++ i)
    {
        for (j = 1; j <= min(i, a); ++ j)
        {
            if (j > 1)
                add(dp[i][j][0], dp[i - 1][j - 1][0]);
            else
                add(dp[i][j][0], s[i - 1][1]);

            add(s[i][0], dp[i][j][0]);
        }
        for (j = 1; j <= min(i, b); ++ j)
        {
            if (j > 1)
                add(dp[i][j][1], dp[i - 1][j - 1][1]);
            else
                add(dp[i][j][1], s[i - 1][0]);

            add(s[i][1], dp[i][j][1]);
        }
    }
    k[0] = strlen(S);
    for (i = 0; i < k[0]; ++ i)
        k[k[0] - i] = S[i] - '0';
}
void write()
{
    int Pow, x, p;
    freopen("pavare2.out", "w", stdout);
    add(v, s[n][1]);
    add(v, s[n][0]);
    for (i = v[0]; i >= 1; -- i)
        printf("%d", v[i]);
    printf("\n");
    if (comp(s[n][0], k) == -1)
    {
        sub(k, s[n][0]);
        p = 1;
    }
    else p = 0;
    i = n;
    while (i > 0)
    {
        if (p == 0)
        {
            for (j = max(0, i - a); j < i && comp(s[j][1], k) == -1; ++ j)
                sub(k, s[j][1]);
            while (i > j)
                printf("0"),
                      -- i;
            p = 1;
        }
        else
        {
            for (j = i - 1; j >= 0 && j > i - b && comp(s[j][0], k) == -1; -- j)
                 sub(k, s[j][0]);
            while (i > j)
                printf("1"),
                      -- i;
            p = 0;
        }
    }
}
int main()
{
    read();
    solve();
    write();
    return 0;
}