Pagini recente » Cod sursa (job #754743) | Cod sursa (job #1816514) | Cod sursa (job #2357448) | Cod sursa (job #2966530) | Cod sursa (job #2413656)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("cowfood.in");
ofstream fout("cowfood.out");
const int Mod=3210121;
int n,k,s,sol;
int x[25];
int a[25][35],dp[35][10005];
void Back(int top,int lg)
{
if(top==n+1)
{
int sum=0;
for(int i=1;i<=k;i++)
sum+=x[i];
if(sum>s || !sum)return ;
if(lg%2)sol+=dp[k][s-sum];
else sol-=dp[k][s-sum];
if(sol>=Mod)sol-=Mod;
if(sol<0)sol+=Mod;
return ;
}
int aux[25];
for(int i=1;i<=k;i++)
aux[i]=x[i];
Back(top+1,lg);
for(int i=1;i<=k;i++)
x[i]=aux[i];
for(int i=1;i<=k;i++)
x[i]=max(x[i],a[top][i]);
Back(top+1,lg+1);
for(int i=1;i<=k;i++)
x[i]=aux[i];
}
int main()
{
fin>>k>>s>>n;
for(int i=1;i<=n;i++)
for(int j=1;j<=k;j++)
fin>>a[i][j];
for(int i=0;i<=s;i++)
dp[0][i]=1;
for(int i=1;i<=k;i++)
dp[i][0]=1;
for(int i=1;i<=k;i++)
for(int j=1;j<=s;j++)
{
dp[i][j]=dp[i-1][j]+dp[i][j-1];
if(dp[i][j]>=Mod)dp[i][j]-=Mod;
}
sol=dp[k][s]-k*s-1;
Back(1,1);
fout<<sol<<"\n";
return 0;
}