Cod sursa(job #2603256)

Utilizator Ioana_GaborGabor Ioana Ioana_Gabor Data 18 aprilie 2020 21:42:08
Problema Cowfood Scor 38
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.73 kb

#include <bits/stdc++.h>
#define NMAX 20
#define KMAX 30
#define VALMAX 10030
#define MOD 3210121

using namespace std;

ifstream f("cowfood.in");
ofstream g("cowfood.out");

int k,s,n;
int am[NMAX+5][KMAX+5];
long long fact[VALMAX+5],invfact[VALMAX+5],tot,nr;

long long putere(long long x,int e){
    long long ret=1;
    while(e){
        if(e%2==0){
            x=(1LL*x*x)%MOD;
            e/=2;
        }else{
            ret=(1LL*ret*x)%MOD;
            e--;
        }
    }
    return ret;
}

int main(){
    fact[0]=invfact[0]=1;
    for(int i=1;i<=VALMAX;i++){
        fact[i]=(1LL*fact[i-1]*i)%MOD;
        invfact[i]=putere(fact[i],MOD-2);
    }
    f>>k>>s>>n;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=k;j++){
            f>>am[i][j];
        }
    }
    for(int i=2;i<=s;i++){
        nr=(((1LL*fact[i+k-1]*invfact[k-1])%MOD*invfact[i])%MOD+MOD-k)%MOD;
        tot=(tot+nr)%MOD;
    }
    int cnt=0,suma,maxim;
    for(int stare=1;stare<(1<<n);stare++){
        cnt=0;
        for(int j=1;j<=n;j++){
            if((stare>>(j-1))&1){
                cnt++;
            }
        }
        suma=0;
        for(int jj=1;jj<=k;jj++){
            maxim=0;
            for(int j=1;j<=n;j++){
                if((stare>>(j-1))&1){
                    maxim=max(maxim,am[j][jj]);
                }
            }
            suma+=maxim;
        }
        if(cnt%2==0){
            for(int i=0;i<=s-suma;i++){
                nr=(((1LL*fact[i+k-1]*invfact[k-1])%MOD*invfact[i])%MOD)%MOD;
                tot=(tot+nr)%MOD;
            }
        }else{
            for(int i=0;i<=s-suma;i++){
                nr=(((1LL*fact[i+k-1]*invfact[k-1])%MOD*invfact[i])%MOD)%MOD;
                tot=(tot-nr+MOD)%MOD;
            }
        }
    }
    g<<tot;
}