Pagini recente » Cod sursa (job #3209189) | Cod sursa (job #1343136) | Cod sursa (job #1430980) | Cod sursa (job #107425) | Cod sursa (job #627460)
Cod sursa(job #627460)
#include <stdio.h>
#define NMAX 21
#define KMAX 31
#define LMAX 10005
#define HMAX (1<<20)
#define MOD 3210121
#define ll long long
int k,s,n,A[NMAX][KMAX],B[KMAX][LMAX],S[KMAX][LMAX],rez,C[HMAX][KMAX],nbiti[HMAX];
void read()
{
scanf("%d%d%d",&k,&s,&n);
int i,j;
for (i=1; i<=n; i++)
for (j=1; j<=k; j++)
scanf("%d",&A[i][j]);
}
void precompute()
{
int i,j;
for (i=0; i<=s; i++)
B[1][i]=1,S[1][i]=i+1;
for (i=2; i<=k; i++)
for (j=0; j<=s; j++)
{
B[i][j]=S[i-1][j];
S[i][j]=(S[i][j-1]+B[i][j])%MOD;
}
}
inline int max(int x,int y)
{
return x>y ? x : y;
}
void solve()
{
int i,j,t,stare,sum;//incerc sa obtin toate posibilitatile valide
rez=S[k][s]; //le pun oricum pe alea k
rez-=(k*s+1)%MOD; //scad cand doar 1 sg valoare e pozitiva sau niciuna
if (rez<0)
rez+=MOD;
for (i=1; i<(1<<n); i++)
{
for (j=1; j<=n; j++)
if (i & 1<<(j-1))
{
stare=i ^ (1<<(j-1));
for (t=1; t<=k; t++)
C[i][t]=max(C[stare][t],A[j][t]);
break ;
}
sum=0;
for (j=1; j<=k; j++)
sum+=C[i][j];
nbiti[i]=nbiti[i>>1]+(i & 1);
if (nbiti[i] & 1)
{
rez-=S[k][s-sum];
if (rez<0)
rez+=MOD;
}
else
{
rez+=S[k][s-sum];
if (rez>MOD)
rez-=MOD;
}
}
}
int main()
{
freopen("cowfood.in","r",stdin);
freopen("cowfood.out","w",stdout);
read();
precompute();
solve();
printf("%d\n",rez);
return 0;
}