Cod sursa(job #2153607)

Utilizator RickSanchezRick Sanchez RickSanchez Data 6 martie 2018 12:40:16
Problema Cowfood Scor 18
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.53 kb
#include <bits/stdc++.h>

using namespace std;
ifstream fin("cowfood.in");
ofstream fout("cowfood.out");
const int smax = 10005;
const int mod = 3210121;
int N,K,S,ans;
int st[25], pred[25];
int a[25][35], dp[25][smax];


inline void Read()
{
    int i,j;
    fin >> K >> S >> N;
    for(i = 1; i <= N; i++)
        for(j = 1; j <= K; j++)
            fin >> a[i][j];
}

inline void Fix(int &x)
{
    if(x >= mod) x -= mod;
    if(x < 0) x += mod;
}

inline void Compute_DP()
{
    int i,j;
    for(i = 0; i <= S; i++) dp[0][i] = 1;
    for(i = 1; i <= K; i++)
    {
        dp[i][0] = 1;
        for(j = 1; j <= S; j++)
        {
            dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
            Fix(dp[i][j]);
        }
    }
    ans = dp[K][S] - 1 - K * S;
    Fix(ans);
}



inline void Back(int top, int cnt)
{
    int i, sum, sign;
    if(top == N + 1)
    {
        sum = 0;
        for(i = 1; i <= K; i++)
            sum += st[i];
        if(sum > S || sum == 0) return;
        if(cnt & 1) sign = -1;
        else sign = 1;
        ans += (sign * dp[K][S - sum]);
        Fix(ans);
        return;
    }
    Back(top + 1, cnt);

    for(i = 1; i <= K; i++)
        pred[i] = st[i];

    for(i = 1; i <= K; i++)
        st[i] = max(st[i],a[top][i]);
    Back(top + 1, cnt + 1);

   for(i = 1; i <= K; i++)
        st[i] = pred[i];
}


inline void Solve()
{
    Back(1,0);
    fout << ans << "\n";
}


int main()
{
    Read();
    Compute_DP();
    Solve();
    return 0;
}