Cod sursa(job #2883187)

Utilizator mateitudordmDumitru Matei mateitudordm Data 1 aprilie 2022 11:46:24
Problema Plus Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.45 kb
#include <fstream>
#define smax 100000

using namespace std;

int p1, p2, u[4][2 * smax + 1], mu[4][2 * smax + 1], smen[2 * smax + 1];
int zero, unu[4], minus_unu[4];

int main()
{
    ifstream cin ("plus.in");
    ofstream cout ("plus.out");
    int s, nrb, nr, i, j;
    long long cnt = 0;
    cin >> s;
    for (i = 1; i <= 3; i++)
    {
        cin >> nrb >> nr;
        if (nr == 0)
            zero++;
        else if (nr == 1)
            unu[++p1] = nrb;
        else if (nr == -1)
            minus_unu[++p2] = nrb;
    }
    u[0][0] = 1;
    for (i = 1; i <= 3; i++)
    {
        for (j = 0; j <= 100000; j++)
            smen[j] = 0;
        for (j = 0; j <= 100000; j++)
            if (u[i - 1][j] != 0)
                smen[j] += u[i - 1][j], smen[j + unu[i] + 1] -= u[i - 1][j];
        u[i][0] = smen[0];
        for (j = 1; j <= 100000; j++)
            u[i][j] = u[i][j - 1] + smen[j];
    }
    mu[0][0] = 1;
    for (i = 1; i <= 3; i++)
    {
        for (j = 0; j <= 100000; j++)
            smen[j] = 0;
        for (j = 0; j <= 100000; j++)
            if (mu[i - 1][j] != 0)
                smen[j] += mu[i - 1][j], smen[j + unu[i] + 1] -= mu[i - 1][j];
        mu[i][0] = smen[0];
        for (j = 1; j <= 100000; j++)
            mu[i][j] = mu[i][j - 1] + smen[j];
    }
    i = s;
    while (u[3][i] && mu[3][i - s])
        cnt += u[3][i] * mu[3][i - s], i++;
    cout << cnt* (zero + 1);
    return 0;
}