Cod sursa(job #1975502)

Utilizator KusikaPasa Corneliu Kusika Data 1 mai 2017 09:44:48
Problema Cowfood Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.2 kb
#include <bits/stdc++.h>
using namespace std;

//Constants
const long long INF = std::numeric_limits<long long>::max();
const long long MOD = 3210121;
const long double PI = 3.141592653589793;

//MACROS
#define pb push_back
#define rep(i, begin, end) for (__typeof(end) i = (begin) - ((begin) > (end)); i != (end) - ((begin) > (end)); i += 1 - 2 * ((begin) > (end)))
typedef long long LL;
typedef pair <int,int> PII;

int n, s, k, a[33][33], cur[33];
LL dp[11111], ans;

void brute(int lvl, int mask) {
    if (lvl == n + 1) {
        int ss = 0;
        rep(i,1,k+1) ss += cur[i];
        if (ss > s) return;
        if (mask&1) ans = (ans - dp[s-ss] + MOD) % MOD;
        else ans = (ans + dp[s-ss]) % MOD;
    } else {
        brute(lvl+1,mask);
        int prev[33];
        rep(i,1,k+1) prev[i] = cur[i], cur[i] = max(cur[i],a[lvl][i]);
        brute(lvl+1,mask+1);
        rep(i,1,k+1) cur[i] = prev[i];
    }
}

int main() {
	freopen("cowfood.in","r",stdin);
	freopen("cowfood.out","w",stdout);
	cin >> k >> s >> n;
	rep(i,1,n+1) rep(j,1,k+1) cin >> a[i][j];
	rep(i,0,s+1) dp[i] = 1;
	rep(i,1,k+1) rep(j,1,s+1) dp[j] = (dp[j] + dp[j-1]) % MOD;
	brute(1,0);
	cout << (ans - s*k - 1 + MOD) % MOD;
}