Pagini recente » Cod sursa (job #1998571) | Cod sursa (job #2233799) | Cod sursa (job #1779732) | Cod sursa (job #2325764) | Cod sursa (job #1956912)
#include <fstream>
#include <vector>
#include <string.h>
#include <algorithm>
#define kMax 31
#define sMax 10001
#define MOD 3210121
using namespace std;
ifstream fin("cowfood.in");
ofstream fout("cowfood.out");
int n, S, nrRestr, v[kMax], restr[kMax][kMax];
long long dp[kMax][sMax], Sol;
void back(int poz, long long bit)
{
if(poz==nrRestr+1)
{
if(bit)
{
long long semn;
if(bit&1)
semn=1;
else
semn=-1;
long long Sum=0;
for(int i=1; i<=n; i++)
Sum+=v[i];
if(Sum<=S)
{
Sol+=semn*dp[n][S-Sum];
Sol=((Sol%MOD)+MOD)%MOD;
}
}
return;
}
back(poz+1, bit);
int aux[kMax];
memset(aux, 0, sizeof(aux));
for(int i=1; i<=n; i++)
{
aux[i]=v[i];
v[i]=max(v[i], restr[poz][i]);
}
back(poz+1, bit+1);
for(int i=1; i<=n; i++)
v[i]=aux[i];
}
int main()
{
fin>>n>>S>>nrRestr;
for(int i=1; i<=nrRestr; i++)
for(int j=1; j<=n; j++)
fin>>restr[i][j];
for(int i=0; i<=S; i++)
dp[0][i]=1;
for(int i=1; i<=n; i++)
dp[i][0]=1;
for(int i=1; i<=n; 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;
}
}
back(1, 0);
fout<<((1ll*(dp[n][S]-1-n*S-Sol))%MOD+MOD)%MOD;
}