Pagini recente » Cod sursa (job #105051) | Cod sursa (job #104850) | Cod sursa (job #829044) | Cod sursa (job #2284502) | Cod sursa (job #981108)
Cod sursa(job #981108)
#include<stdio.h>
#define kmax 33
#define smax 10005
#define modulo 3210121
long k, s, n, nt, ng, i, j, sum, nels;
long a[kmax][kmax], p[smax][kmax], sol[kmax], m[smax], amax[kmax][kmax];
void citire()
{
scanf("%ld %ld %ld",&k,&s,&n);
for (i=1;i<=n;i++)
for (j=1;j<=k;j++)
scanf("%ld",&a[i][j]);
}
void precalculare()
{
for (j=1;j<=k;j++)
p[0][j]=1;
for (i=1;i<=s;i++)
{
// p[i][0]=1;
for (j=1;j<=k;j++)
p[i][j]=(p[i-1][j]+p[i][j-1])%modulo;
}
m[0]=1;
for (i=1;i<=s;i++)
m[i]=(m[i-1]+p[i][k])%modulo;
}
void calculare()
{
sum=s;
for (i=1;i<=k;i++)
sum-=amax[nels][i];
if (sum>=0)
if (nels%2==1)
ng=(ng+m[sum])%modulo;
else
ng=(ng-m[sum]+modulo)%modulo;
}
void gen(long poz)
{
long x, i;
if (poz>1)
{ nels=poz-1; calculare(); }
for (x=sol[poz-1]+1;x<=n;x++)
{
for (i=1;i<=k;i++)
{
amax[poz][i]=amax[poz-1][i];
if (amax[poz][i]<a[x][i])
amax[poz][i]=a[x][i];
}
sol[poz]=x; gen(poz+1);
}
}
int main()
{
freopen("cowfood.in","r",stdin);
freopen("cowfood.out","w",stdout);
citire();
precalculare();
gen(1);
nt=(m[s]-(k*s)%modulo-1+modulo)%modulo;
printf("%ld",(nt-ng+modulo)%modulo);
return 0;
}