Cod sursa(job #3133579)

Utilizator zmariucamaria zahiu zmariuca Data 26 mai 2023 10:35:02
Problema Cowfood Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.47 kb
#include <fstream>

using namespace std;

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

const int maxN = 10005, mod = 3210121;
int p, sum, n, a[35][35], tot[35][35];
int dp[35][maxN];
int ans;

void check(int on)
{
    int s = 0, nenul = 0;
    for(int i = 1; i <= p; i++)
    {
        s += tot[n][i];
        if(tot[n][i] > 0)
            nenul++;
    }
    if(nenul < 2 || s > sum)
        return;
    if(on % 2 == 1)
        ans -= dp[p][sum - s];
    if(on % 2 == 0)
        ans += dp[p][sum - s];
    if(ans < 0)
        ans += mod;
    if(ans >= mod)
        ans -= mod;
}

void bkt(int k, int on)
{

    for(int i = 1; i <= p; i++)
        tot[k][i] = tot[k - 1][i];
    if(k == n)
        check(on);
    else
        bkt(k + 1, on);
    for(int i = 1; i <= p; i++)
        tot[k][i] = max(tot[k - 1][i], a[k][i]);
    if(k == n)
        check(on + 1);
    else
        bkt(k + 1, on + 1);
}

int main()
{
    in >> p >> sum >> n;
    for(int i = 1; i <= n; i++)
        for(int j = 1; j <= p; j++)
            in >> a[i][j];
    dp[0][0] = 1;
    for(int i = 1; i <= p; i++)
    {
        dp[i][0] = 1;
        for(int j = 1; j <= sum; j++)
            dp[i][j] = (dp[i - 1][j] + dp[i][j - 1]) % mod;
    }
    for(int j = 1; j <= sum; j++)
        dp[p][j] = (dp[p][j] + dp[p][j - 1]) % mod;
    ans = (dp[p][sum] - (sum * p + 1) % mod + mod) % mod;
    if(n != 0)
        bkt(1, 0);
    out << ans;
    return 0;
}