Pagini recente » Infoarena Monthly 2014 - Clasament | Cod sursa (job #502035) | Cod sursa (job #1484738) | Cod sursa (job #2889444) | Cod sursa (job #1956864)
#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], aux[kMax], restr[kMax][kMax];
long long dp[kMax][sMax], Sol;
void back(int poz, long long nr)
{
if(poz==nrRestr+1)
{
if(v[1]!=0)
{
long long Sum=0;
for(int i=1; i<=n; i++)
Sum+=v[i];
if(Sum<=S)
{
Sol+=nr*dp[n][S-Sum];
Sol=((Sol%MOD)+MOD)%MOD;
}
}
return;
}
back(poz+1, nr);
for(int i=1; i<=n; i++)
{
aux[i]=v[i];
v[i]=max(v[i], restr[poz][i]);
}
back(poz+1, -nr);
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, -1);
fout<<((1ll*(dp[n][S]-1-n*S-Sol))%MOD+MOD)%MOD;
}