Pagini recente » Cod sursa (job #2943505) | Borderou de evaluare (job #1475861) | Borderou de evaluare (job #164906) | Cod sursa (job #2809501) | Cod sursa (job #3136655)
//Ilie Dumitru
#include<cstdio>
#include<algorithm>
const int NMAX=21;
const int KMAX=31;
const long long int MOD=3210121;
struct food
{
int v[KMAX];
food operator*(food b)
{
int i;
food a;
for(i=0;i<KMAX;++i)
a.v[i]=std::max(v[i], b.v[i]);
return a;
}
};
long long int invFact[NMAX];
long long int fastExp(long long int x, long long int y)
{
if(y==0)
return 1;
if(y==1)
return x;
long long int a=fastExp(x, y>>1);
a=a*a%MOD;
if(y&1)
a=a*x%MOD;
return a;
}
void precalc()
{
int i, f=1;
invFact[0]=1;
for(i=1;i<NMAX;++i)
invFact[i]=fastExp(f=f*i%MOD, MOD-2);
}
long long int getCnt(int N, int S)
{
long long int ans=1;
int i;
for(i=1;i<=N;++i)
ans=ans*(S+i)%MOD;
return ans*invFact[N]%MOD;
}
int N, K, S;
int ans=0;
food v[NMAX];
void back(int k, food& f, bool added=1)
{
if(k==N)
{
int i, s=S;
for(i=0;i<K;++i)
s-=f.v[i];
if(s>-1)
{
if(added)
ans=(ans+getCnt(K, s))%MOD;
else
ans=(ans-getCnt(K, s)+MOD)%MOD;
}
}
else
{
food prop=v[k]*f;
back(k+1, f, added);
back(k+1, prop, !added);
}
}
int main()
{
FILE* f=fopen("cowfood.in", "r"), *g=fopen("cowfood.out", "w");
//FILE* f=stdin, *g=stdout;
int i, j;
food aux;
precalc();
fscanf(f, "%d%d%d", &K, &S, &N);
for(i=0;i<K;++i)
aux.v[i]=0;
for(i=0;i<N;++i)
for(j=0;j<K;++j)
fscanf(f, "%d", v[i].v+j);
back(0, aux);
fprintf(g, "%d\n", (int)((ans-K*S-1+MOD)%MOD));
fclose(f);
fclose(g);
return 0;
}