Cod sursa(job #2883211)

Utilizator mateitudordmDumitru Matei mateitudordm Data 1 aprilie 2022 12:12:29
Problema Plus Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.54 kb
#include <fstream>
#define smax 100000
using namespace std;

unsigned long long p1, p2, u[4][4 * smax + 5], mu[4][4 * smax + 5], smen[4 * smax + 5];
unsigned long long zero, unu[4], minus_unu[4];

int main()
{
    ifstream cin ("plus.in");
    ofstream cout ("plus.out");
    unsigned long long s, nrb, i, j, cnt = 0;
    int nr;
    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 <= 3 * smax; j++)
            smen[j] = 0;
        for (j = 0; j <= 3 * smax; 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 <= 3 * smax; j++)
            u[i][j] = u[i][j - 1] + smen[j];
    }
    mu[0][0] = 1;
    for (i = 1; i <= 3; i++)
    {
        for (j = 0; j <= 3 * smax; j++)
            smen[j] = 0;
        for (j = 0; j <= 3 * smax; j++)
            if (mu[i - 1][j] != 0)
                smen[j] += mu[i - 1][j], smen[j + minus_unu[i] + 1] -= mu[i - 1][j];
        mu[i][0] = smen[0];
        for (j = 1; j <= 3 * smax; j++)
            mu[i][j] = mu[i][j - 1] + smen[j];
    }
    i = s;
    while (u[3][i])
    {
        if (mu[3][i - s])
            cnt += u[3][i] * mu[3][i - s];
        i++;
    }
    cout << cnt* (zero + 1);
    return 0;
}