Cod sursa(job #2169804)

Utilizator usureluflorianUsurelu Florian-Robert usureluflorian Data 14 martie 2018 17:45:54
Problema Cowfood Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.56 kb
#include <fstream>
#include <cstring>
using namespace std;
ifstream f ("cowfood.in");
ofstream g ("cowfood.out");
typedef long long ll;
const ll mod=3210121;
const int nmax=33;
ll usu[nmax],k,s,n,v[nmax][nmax],tt,act,smn,sol;
ll put(ll t,ll b)
{
      ll a=1ll,p=1ll*t;
      while(b)
      {
            if(b&1) a=a*p%mod;
            p=p*p%mod;
            b/=2;
      }
      return a;
}
ll comb(ll n,ll k)
{
      ll a=1ll,b=1ll;
      for(ll i=k+1;i<=n;++i)
      {
            a=1ll*a*i%mod;
      }
      for(ll i=2;i<=(n-k);++i)
      {
            b=1ll*b*i%mod;
      }
      b=put(b,mod-2)%mod;
      a=a*b%mod;
      return a;
}
int main()
{
      f>>k>>s>>n;
      sol=((comb(k,2)%mod)*comb(k+s-3,k-1))%mod;
      for(ll i=1;i<=n;++i)
      {
            for(ll j=1;j<=k;++j)
            {
                  f>>v[i][j];
            }
      }
      for(ll i=1;i<(1<<k)-1;++i)
      {
            tt=i;
            act=1;
            memset(usu,0,sizeof(usu));
            while(tt)
            {
                  if(tt&1)
                  {
                        for(ll j=1;j<=k;++j) usu[j]=max(usu[j],v[act][j]);
                  }
                  ++act;
                  tt/=10;
            }
            if(act%2) smn=1;
            else smn=-1;
            act=0;
            for(ll j=1;j<=k;++j) act+=usu[j];
            if(act>s) continue;
            sol=sol+(smn*comb(k+act-1,k-1))%mod;
            while(sol>mod) sol-=mod;
            while(sol<0) sol+=mod;
      }
      g<<sol;
      return 0;
}