Pagini recente » Cod sursa (job #2366210) | Cod sursa (job #555251) | Cod sursa (job #3292117) | Cod sursa (job #2905586) | Cod sursa (job #1502062)
#include <fstream>
using namespace std;
ifstream f("cowfood.in");
ofstream g("cowfood.out");
int N,K,S,ans;
int M[10005][35];
const int MOD = 3210121;
int s[25],X[35][35];
int Matrix[35][35],DP[10005][35],aux,sign=1;
void precalcM()
{
for(int i=0;i<=K;i++)
M[0][i]=1;
for(int i=1;i<=S;i++)
for(int j=1;j<=K;j++)
{
M[i][j]=M[i-1][j]+M[i][j-1];
if(M[i][j]>=MOD)
M[i][j]-=MOD;
}
for(int i=1;i<=S;i++)
for(int j=1;j<=K;j++)
{
if(j==K)
{
aux+=M[i][j]-j;
while(aux>=MOD)
aux-=MOD;
while(aux<0)
aux+=MOD;
}
M[i][j]=M[i-1][j]+M[i][j];
if(M[i][j]>=MOD)
M[i][j]-=MOD;
}
}
void precalcDP()
{
for(int i=1;i<=S;i++)
for(int j=1;j<=i;j++)
{
if(j==1)
DP[i][j]=1;
else
DP[i][j]=DP[i][j-1]+DP[i-1][j];
if(DP[i][j]>=MOD)
DP[i][j]-=MOD;
if(j==K)
aux+=DP[i][j];
if(aux>=MOD)
aux-=MOD;
}
}
void Read()
{
f>>K>>S>>N;
for(int i=1;i<=N;i++)
for(int j=1;j<=K;j++)
f>>Matrix[i][j];
}
void Back(int k)
{
for(int i=s[k-1]+1;i<=N;i++)
{
s[k]=i;
int sum=0;
for(int j=1;j<=K;j++)
X[k][j]=max(X[k-1][j],Matrix[i][j]),sum+=X[k][j];
if(S>=sum)
ans+=M[S-sum][K]*sign;
while(ans<0)
ans+=MOD;
while(ans>=MOD)
ans-=MOD;
sign=-sign;
if(k<N)
Back(k+1);
sign=-sign;
}
}
int main()
{
Read();
precalcM();
Back(1);
g<<((aux-ans)+MOD)%MOD<<"\n";
return 0;
}