Cod sursa(job #998076)

Utilizator dariusdariusMarian Darius dariusdarius Data 15 septembrie 2013 17:49:52
Problema Cowfood Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.38 kb
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int mod=3210121;
int f[20][31];
int p[31];
int pw(int x,int y)
{
    int r;
    for(r=1;y;y>>=1)
    {
        if(y&1) r=(1LL*r*x)%mod;
        x=(1LL*x*x)%mod;
    }
    return r;
}
int invmod(int x) {return pw(x,mod-2);}
int fact[10005];
int C(int n,int k)
{
    int ans=fact[n];
    ans=(1LL*ans*invmod(fact[k]))%mod;
    ans=(1LL*ans*invmod(fact[n-k]))%mod;
    return ans;
}
int ans,n,k,s,d[10005];
int V[25][35];
void backt(int p,int semn)
{
    if(p==n+1)
    {
	//for(int i=1;i<=k;i++)
	//	fprintf(stderr,"%d ",V[nod-1][i]);
        //fprintf(stderr,"\n");
	int sum=s;
        for(int i=1;i<=k;i++)
            sum-=V[n][i];
        if(sum>=0)
                ans=(ans+semn*d[sum]+mod)%mod;
        return;
    }
    for(int i=1;i<=k;i++)
        V[p][i]=V[p-1][i];
    backt(p+1,semn);
    for(int i=1;i<=k;i++)
        V[p][i]=max(V[p-1][i],f[p][i]);
    backt(p+1,-semn);
}
int main()
{
    freopen("cowfood.in","r",stdin);
    freopen("cowfood.out","w",stdout);
    scanf("%d%d%d",&k,&s,&n);
    for(int i=1;i<=n;i++)
        for(int j=1;j<=k;j++)
            scanf("%d",&f[i][j]);
    fact[0]=1;
    for(int i=1;i<=s+k-1;i++)
        fact[i]=(1LL*fact[i-1]*i)%mod;
    d[0]=1;
    for(int i=1;i<=s;i++)
        d[i]=(C(i+k-1,k-1)+d[i-1])%mod;
    backt(1,1);
    printf("%d\n",(ans-s*k-1+mod)%mod);
    return 0;
}