Cod sursa(job #986556)

Utilizator Impaler_009Mihai Nitu Impaler_009 Data 19 august 2013 01:48:03
Problema Cowfood Scor 100
Compilator cpp Status done
Runda Lista lui wefgef Marime 1.62 kb
#include <fstream>
#define maxs 10040
#define ll long long

using namespace std;

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

ll k,s,n;
ll f[maxs],crs[maxs];
ll m[21][31],v[31];

ll x,nkinv,kinv,NK,K,N,S;
ll mod =3210121;

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 (int x, int nr)
{
    if (nr!=0)
    {
    int ts=0;
    for (int j=1; j<=k; ++j) ts+=v[j];
    ts=(s-ts);
    if (ts>=0)
    {
        if (nr&1) {S -= crs[ts]; if (S<0) S+=mod;}
        else {S += crs[ts]; if (S>=mod) S-=mod;}
    } }

    int temp [31];
    for (int i = x+1; i<=n; ++i)
    {
        for (int j=1; j<=k; ++j)
        {
            temp[j] = v[j];
            v[j] = max (v[j],m[i][j]);
        }
        subsets (i,nr+1);

       for (int j=1; j<=k; ++j) v[j] = temp[j];
    }
}

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+k; ++i) f[i] = (f[i-1]*i) % mod;

    crs[0]=1;

    NK = f[k-1];

    inverse (mod,NK,x,nkinv);

    if (nkinv<=0) nkinv = mod + nkinv%mod;

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

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

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

    S += crs[s]-1;
    S = (S-s*k)%mod;

    subsets (0,0);

    fout<<S;
}