Pagini recente » Cod sursa (job #2550207) | Cod sursa (job #1141306) | Cod sursa (job #2050752) | Cod sursa (job #113767) | Cod sursa (job #1722144)
#include<cstdio>
#define MAXN 35
#define MAXS 10110
#define MOD 3210121
using namespace std;
int k,s,n;
int a[MAXN][MAXN],combinations[MAXS][MAXN],v[MAXN],sum=0,previous[MAXN][MAXN];
int minimum(int x,int y){
if(x<y)
return x;
return y;
}
int maximum(int x,int y){
if(x>y)
return x;
return y;
}
void Backtracking(int level,int sign){
int i,current;
if(level==n+1){
if(sign==0)
return;
current=s+k;
for(i=1;i<=k;i++)
current-=v[i];
if(current<k)
return;
if(sign%2==1){
sum=sum+combinations[current][k];
if(sum>=MOD)
sum-=MOD;
}
else{
sum=sum-combinations[current][k];
if(sum<0)
sum+=MOD;
}
return;
}
Backtracking(level+1,sign);
for(i=1;i<=k;i++){
previous[level][i]=v[i];
v[i]=maximum(v[i],a[level][i]);
}
Backtracking(level+1,sign+1);
for(i=1;i<=k;i++)
v[i]=previous[level][i];
}
int main(){
freopen("cowfood.in","r",stdin);
freopen("cowfood.out","w",stdout);
int i,j,answer;
scanf("%d%d%d",&k,&s,&n);
for(i=1;i<=n;i++)
for(j=1;j<=k;j++)
scanf("%d",&a[i][j]);
for(i=0;i<=s+k;i++)
combinations[i][0]=1;
for(i=1;i<=s+k;i++)
for(j=1;j<=minimum(i,k);j++){
combinations[i][j]=combinations[i-1][j]+combinations[i-1][j-1];
if(combinations[i][j]>=MOD)
combinations[i][j]-=MOD;
}
Backtracking(1,0);
answer=((combinations[s+k][k]-sum-s*k-1)%MOD+MOD)%MOD;
printf("%d",answer);
return 0;
}