Cod sursa(job #1437357)

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

int K,S,N,a[30][40],fact[12000],arr[40],nr,INV[12000];

int inv(int nr){
    int p=prim-2,res=1;

    while (p){
        if (p&1)
            res=(1LL*res*nr)%prim;
        nr=(1LL*nr*nr)%prim;
        p>>=1;
    }

    return res;
}

void bck(int k, int cnt){
    if (cnt==0){
        int i,val=S;
        for (i=1; i<=K; i++)
            val-=arr[i];
        if (val<0) return;
        nr=(nr+1LL*fact[val+K]*INV[val]*INV[K])%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];

    fact[0]=1;
    INV[0]=1;
    for (i=1; i<=11000; i++){
        fact[i]=(1LL*fact[i-1]*i)%prim;
        INV[i]=inv(fact[i]);
    }

    int res=((1LL*fact[S+K]*INV[S]*INV[K]-K*S-1)%prim+prim)%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;
}