Cod sursa(job #2276429)

Utilizator ardutgamerAndrei Bancila ardutgamer Data 4 noiembrie 2018 18:37:59
Problema Cowfood Scor 28
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.74 kb
#include <cstdio>
#include <algorithm>
#define MOD 3210121

using namespace std;

int k , s , n;
const int NMAX = 20005;
int res=0;
int a[25][35],fact[NMAX],dp[NMAX],imod[NMAX],viz[35],st[35];
int ma[35][35];

int POW(int x, int n)
    {
        if ( n == 0 ) return 1;
        int res = POW(x, n / 2);
        res = (1LL * res * res) % MOD;
        if ( n % 2 == 1 )
            res = (1LL * res * x) % MOD;
        return res;
    }
int combinari(int n,int k)
{
    if(n == 0)
        return 1;
    int temp = (1LL * fact[n] * imod[k]) % MOD;
    temp = (1LL * temp * imod[n-k]) % MOD;
    return temp;
}

void backt(int nr,int pos)
{
    if(nr > 0)
    {
        for(int i = 1 ; i <= k ; i++)
            ma[nr][i] = max(ma[nr-1][i],a[nr][i]);
        int sum = 0;
        for(int i = 1 ; i <= k ; i++)
            sum += ma[nr][i];
        if(sum <= s)
        {
            if(nr & 1)
                res = (res + dp[s-sum])%MOD;
            else
                res = (MOD + res - dp[s-sum])%MOD;
        }
    }
    if(nr < n)
        for(int i = pos+1 ; i <= n ; i++)
            backt(nr+1,i);
}

int main()
{
    freopen("cowfood.in","r",stdin);
    freopen("cowfood.out","w",stdout);
    fact[0] = 1;
    imod[0] = 1;
    for (int i = 1; i <= NMAX-5; ++i)
    {
        fact[i] = (1LL  * fact[i - 1] * i) % MOD;
        imod[i] = POW(fact[i], MOD - 2);
    }
    scanf("%d%d%d",&k,&s,&n);
    for(int i = 1 ; i <= n ; i++)
        for(int j = 1 ; j <= k ; j++)
            scanf("%d",&a[i][j]);
    dp[0] = 1;
    for(int i = 1 ; i <= s ; i++)
        dp[i] = (dp[i-1] + combinari(i+k-1,k-1)) % MOD; /// Stars and bars
    backt(0,0);
    printf("%d",(dp[s]-s*k+MOD-res-1)%MOD);
    return 0;
}