Cod sursa(job #2940949)

Utilizator IvanAndreiIvan Andrei IvanAndrei Data 16 noiembrie 2022 19:57:44
Problema Pavare2 Scor 35
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 4.53 kb
/// proba sa ma asigur ca nu pica dinamica si signal 11
#include <fstream>
#include <string>

using namespace std;

ifstream in ("pavare2.in");
ofstream out ("pavare2.out");

int dp[102][2][101][101], ans[101], curent[101];

void suma (int s[], int x[], int y[])
{
    int t = 0, i;
    for (i = 1; i <= x[0] || i <= y[0]; i++)
    {
        int aux = x[i] + y[i] + t;
        s[i] = aux % 10;
        t = aux / 10;
    }
    s[0] = i - 1;
    if (t > 0)
    {
        s[++s[0]] = t;
    }
}

void dif (int d[], int x[], int y[])
{
    int t = 0;
    d[0] = x[0];
    for (int i = 1; i <= x[0]; i++)
    {
        int k = x[i] - t - y[i];
        if (x[i] - t < y[i])
        {
            k += 10;
            t = 1;
        }
        else
        {
            t = 0;
        }
        d[i] = k;
    }
    while (d[d[0]] == 0)
    {
        d[0]--;
    }
}

int cmp (int x[], int y[])
{
    if (x[0] > y[0])
    {
        return 1;
    }
    if (x[0] < y[0])
    {
        return -1;
    }
    for (int i = x[0]; i > 0; i--)
    {
        if (x[i] > y[i])
        {
            return 1;
        }
        else
        {
            return -1;
        }
    }
    return 0;
}

int main ()
{
    dp[1][0][1][0] = 1;
    dp[1][0][1][1] = 1;
    dp[1][1][1][0] = 1;
    dp[1][1][1][1] = 1;
    int n, a, b;
    string aaaaaaa;
    in >> n >> a >> b >> aaaaaaa;
    for (int i = 1; i <= n; i++)
    {
        for (int j = 0; j < 2; j++)
        {
            if (j == 0)
            {
                for (int k = 1; k < a; k++)
                {
                    suma(dp[i + 1][j][k + 1], dp[i + 1][j][k + 1], dp[i][j][k]);
                    suma(dp[i + 1][1 - j][1], dp[i + 1][1 - j][1], dp[i][j][k]);
                    suma(dp[i][j][0], dp[i][j][0], dp[i][j][k]);
                }
                suma(dp[i + 1][1 - j][1], dp[i + 1][1 - j][1], dp[i][j][a]);
                suma(dp[i][j][0], dp[i][j][0], dp[i][j][a]);
            }
            else
            {
                for (int k = 1; k < b; k++)
                {
                    suma(dp[i + 1][j][k + 1], dp[i + 1][j][k + 1], dp[i][j][k]);
                    suma(dp[i + 1][1 - j][1], dp[i + 1][1 - j][1], dp[i][j][k]);
                    suma(dp[i][j][0], dp[i][j][0], dp[i][j][k]);
                }
                suma(dp[i + 1][1 - j][1], dp[i + 1][1 - j][1], dp[i][j][b]);
                suma(dp[i][j][0], dp[i][j][0], dp[i][j][b]);
            }
        }
    }
    suma(ans, dp[n][0][0], dp[n][1][0]);
    for (int i = ans[0]; i > 0; i--)
    {
        out << ans[i];
    }
    out << '\n';
    curent[0] = aaaaaaa.size();
    for (int i = curent[0], j = 0; i > 0; i--, j++)
    {
        curent[i] = (aaaaaaa[j] - '0');
    }
    ans[0] = 0;
    ans[1] = 1;
    dif(curent, curent, ans);
    int culoare = 0, ct = n;
    while (ct > 0)
    {
        if (culoare == 0)
        {
            if (cmp(curent, dp[ct][0][0]) == 1)
            {
                dif(curent, curent, dp[ct][0][0]);
            }
            else
            {
                for (int i = a; i > 0; i--)
                {
                    if (cmp(dp[ct][0][i], curent) >= 0)
                    {
                        for (int j = 1; j <= i; j++)
                        {
                            out << 0;
                        }
                        ct -= i;
                        //out << '\n';
                        break;
                    }
                    else
                    {
                        dif(curent, curent, dp[ct][0][i]);
                    }
                }
            }
        }
        else
        {
            if (cmp(curent, dp[ct][1][0]) == 1)
            {
                dif(curent, curent, dp[ct][1][0]);
            }
            else
            {
                for (int i = 1; i <= b; i++)
                {
                    if (cmp(dp[ct][1][i], curent) >= 0)
                    {
                        for (int j = 1; j <= i; j++)
                        {
                            out << 1;
                        }
                        //out << '\n';
                        ct -= i;
                        break;
                    }
                    else
                    {
                        dif(curent, curent, dp[ct][1][i]);
                    }
                }
            }
        }
        culoare = 1 - culoare;
    }
    in.close();
    out.close();
    return 0;
}