Pagini recente » Cod sursa (job #845267) | Cod sursa (job #1042510) | Cod sursa (job #2886062) | Cod sursa (job #710110) | Cod sursa (job #627462)
Cod sursa(job #627462)
#include <stdio.h>
#include <string.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,cfg[KMAX];
char marc[NMAX];
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 update()
{
memset(cfg,0,sizeof(cfg));
int i,j,sum,nbiti=0;
for (i=1; i<=n; i++)
if (marc[i])
{
nbiti++;
for (j=1; j<=k; j++)
cfg[j]=max(cfg[j],A[i][j]);
}
sum=0;
for (j=1; j<=k; j++)
sum+=cfg[j];
if (nbiti==0)
return ;
if (nbiti & 1)
{
rez-=S[k][s-sum];
if (rez<0)
rez+=MOD;
}
else
{
rez+=S[k][s-sum];
if (rez>MOD)
rez-=MOD;
}
}
void back(int poz)
{
if (poz==n+1)
{
update();
return ;
}
marc[poz]=0;
back(poz+1);
marc[poz]=1;
back(poz+1);
}
void solve()
{
//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;
back(1);
}
int main()
{
freopen("cowfood.in","r",stdin);
freopen("cowfood.out","w",stdout);
read();
precompute();
solve();
printf("%d\n",rez);
return 0;
}