Cod sursa(job #986444)

Utilizator Impaler_009Mihai Nitu Impaler_009 Data 18 august 2013 19:21:36
Problema Cowfood Scor 6
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.6 kb
#include <fstream>
#define mod 3210121
#define maxs 10001
#define ll long long

using namespace std;

ifstream fin("cowfood.in");
ofstream fout("cowfood.out");

int k,s,n;
int f[maxs],crs[maxs];
int m[31][21],temp[21];

ll x,nkinv,kinv,NK,K,N,t,S;

void inverse (ll a, ll b, ll &x, ll &y)
{
    if (b==0)
    {
        x=1;
        y=0;
        return;
    }
    ll xp,yp;
    inverse (b,a%b,xp,yp);
    x = yp;
    y = xp - yp*(a/b);
}

int subsets ()
{
    S=0;
    for (int i=1; i<=t; ++i)
    {
        int nr=0;

        for (int j=0; j<n; j++)
        {
            if ((i>>j)&1)
            {
                ++nr;
                for (int h=1; h<=k; ++h)
                   temp[h] = max (temp[h],m[j+1][h]);
            }
        }

        int ts=0;
        for (int h=1; h<=k; ++h) ts+=temp[h];
        ts=s-ts;
        if (ts>=0)
        {
            if (nr&1) S= (S+crs[ts]) %mod;
            else S= (S - crs[ts]) %mod;
        }
        for (int h=1; h<=k; ++h) temp[h]=0;
    }
}

int main()
{
    fin>>k>>s>>n;

    for (int i=1 ; i<=n; ++i)
        for (int j=1; j<=k; ++j)
          fin>>m[i][j];

    f[0]=1;
    for (int i=1; i<=s+n; ++i) f[i] = f[i-1]*i % mod;

    crs[0]=1;

    NK = f[n-1];

    inverse (mod,NK,x,nkinv);

    while (nkinv<0) nkinv += mod;

    for (int i=1; i<=s; ++i)
    {
        N = f[i+n-1];
        K = f[i];

        inverse (mod,K,x,kinv);
        while (kinv<0) kinv += mod;

        crs[i]=crs[i-1]+N*kinv*nkinv%mod;
    }

    t = (1<<n)-1;

    subsets ();

    fout<<(crs[s]-S-n*s-1)%mod;
}