Cod sursa(job #1437364)

Utilizator MaarcellKurt Godel Maarcell Data 17 mai 2015 15:42:03
Problema Cowfood Scor 74
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.66 kb
#include <iostream>
#include <fstream>
#define prim 3210121
using namespace std;

int K,S,N,a[30][40],arr[40],nr,comb[11000][40];



void bck(int k, int cnt){
    if (cnt==0){
        int i,val=S,aux=0,aux2=0;
        for (i=1; i<=K; i++){
            val-=arr[i];
            if (arr[i]!=0) aux++,aux2=arr[i];
        }

        if (val<0) return;
        if (aux==0) {
            nr=(nr+((comb[S+K][K]-K*S-1)%prim))%prim;
            if (nr<0) nr+=prim;
        }
        else if (aux==1){
            nr=(nr-(S-aux2+1))%prim;
            if (nr<0) nr+=prim;
        }
        else{
            nr=nr+comb[val+K][K];
            if (nr>=prim) nr-=prim;
        }

        return ;
    }

    if (N-k>=cnt) bck(k+1,cnt);

    int prev[40],i;
    for (i=1; i<=K; i++)
        prev[i]=arr[i];

    for (i=1; i<=K; i++)
        arr[i]=max(arr[i],a[k][i]);
    bck(k+1,cnt-1);
    for (i=1; i<=K; i++)
        arr[i]=prev[i];
}

int main(){
    ifstream fin("cowfood.in");
    ofstream fout("cowfood.out");
    fin >> K >> S >> N;

    int i,j;
    for (i=1; i<=N; i++)
        for (j=1; j<=K; j++)
            fin >> a[i][j];

    comb[0][0]=1;
    for (i=1; i<=S+K; i++){
        comb[i][0]=1;
        for (j=1; j<=K; j++){
            comb[i][j]=comb[i-1][j]+comb[i-1][j-1];
            if (comb[i][j]>=prim) comb[i][j]-=prim;
        }
    }

    int res=(comb[S+K][K]-K*S-1)%prim;
    if (res<0) res+=prim;

    for (i=1; i<=N; i++){
        nr=0;
        bck(1,i);
        if (i%2) res=(res-nr)%prim;
        else res=(res+nr)%prim;
        if (res<0) res+=prim;
    }

    fout << res << "\n";
    return 0;
}