Cod sursa(job #2638929)

Utilizator loraclorac lorac lorac Data 30 iulie 2020 16:29:37
Problema Cowfood Scor 28
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.35 kb
#include <bits/stdc++.h>
using namespace std;
ifstream in("cowfood.in");
ofstream out("cowfood.out");
typedef unsigned short int si;
const int mod=3210121;
si maxx[30][(1<<20)];
si v[21][31];
int put[1001];
int power(int a,int b)
{
    int ans=1;
    while(b)
    {
        if(b&1) ans=(1LL*ans*a)%mod;
        a=(1LL*a*a)%mod;
        b>>=1;
    }
    return ans;
}
int main()
{
    int k,s,n;
    in>>k>>s>>n;
    for(int i=0;i<n;++i)
    for(int j=1;j<=k;++j)
        in>>v[i][j];
    put[0]=1;
    int fact=1;
    for(int i=1;i<=k;++i)
        fact=(1LL*fact*i)%mod;
    fact=power(fact,mod-2);
    for(int i=1;i<=s;++i)
    {
        put[i]=fact;
        for(int j=i+1;j<=i+k;++j)
            put[i]=(1LL*put[i]*j)%mod;
    }
    int tot=put[s],lim=(1<<n);
    for(int i=0;i<=k;++i)
        maxx[i][0]=0;
    int b,p,sum,r;
    for(int kk=1;kk<lim;++kk)
    {
        r=kk&-kk; b=0;
        while(r>1) r>>=1,++b;
        p=kk-(kk&-kk);
        sum=s;
        for(int i=1;i<=k;++i)
        {
            maxx[i][kk]=max(maxx[i][p],v[b][i]);
            sum-=(int)maxx[i][kk];
        }
        maxx[0][kk]=1-maxx[0][p];
        if(sum>=0)
        {
            if(maxx[0][kk]) tot=(tot-put[sum]+mod)%mod;
            else tot=(tot+put[sum])%mod;
        }
    }
    out<<(tot-(s*k+1)%mod+mod)%mod<<'\n';
    return 0;
}