Cod sursa(job #1550929)

Utilizator rangerChihai Mihai ranger Data 14 decembrie 2015 22:19:57
Problema Cowfood Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.87 kb
# include <bits/stdc++.h>

using namespace std;
const int mod = 3210121;

int n, k, K, S, a[22][33], dp[33][10004];


int sz, sub[20];
long long rs = 0;
int mx[33];

void back(int sz, int mx[33], int Sum = 0)
{
    if (sz) {

        if (Sum >= S) return;
        int sum  = 0;

        for (int i=0;i<K;i++) sum += mx[i];
        if (sum <= S) {

            if (sz&1)  { rs += dp[K][S-sum]; if (rs >= mod) rs -= mod; }
            else { rs -= dp[K][S-sum]; if (rs < 0) rs += mod; }
        }
        Sum = sum;
    }
    if (sz == n) return;

    int mx1[33];
    for(int i=0;i<K;i++) mx1[i] = mx[i];

    int start = (sz == 0 ? 0 : sub[sz-1]+1);
    for (int val = start; val < n; val++)
    {
        for (int j=0;j<K;j++) mx1[j] = max(mx1[j], a[val][j]);
        sub[sz] = val;
        back(sz+1, mx1, Sum);
        for (int j=0;j<K;j++) mx1[j] = mx[j];
    }
}


int main()
{
    freopen("cowfood.in","r",stdin);
    freopen("cowfood.out","w",stdout);

    cin>>K>>S>>n;
    int mn[33];
    for (int i=0;i<=K;i++) mn[i] =S+1;
    for (int i=0;i<n;i++)
       {
           int sum = 0, nr = 0, ps;
            for(int j=0;j<K;j++) {
                    cin >> a[i][j]; sum += a[i][j];
                    if (a[i][j]) nr++, ps = j;
            }
            if(nr == 1) mn[ps] = min(mn[ps], a[i][ps]);
            if (sum == 0) return cout << 0, 0;
       }

    for (int s=0;s<=S;s++) dp[1][s] = s+1;
    for (int k=1;k<=K;k++) dp[k][0] = 1;

    for (int k=2;k<=K;k++)
        for (int s=1;s<=S;s++) {
                dp[k][s] = dp[k-1][s] + dp[k][s-1];
                if (dp[k][s] >= mod) dp[k][s] -= mod;
        }



    back(0, mx);


   rs = dp[K][S] - rs;
   rs --;
 long long tmp = 0;

 for(int i=0;i<K;i++) tmp += mn[i]-1;
 tmp %= mod;
 rs -= tmp;

 if (rs < 0) rs += mod;

    cout << rs;
    return 0;
}