Pagini recente » Cod sursa (job #129118) | Cod sursa (job #2601895) | Cod sursa (job #2837226) | Cod sursa (job #164897) | Cod sursa (job #2416698)
#include <fstream>
using namespace std;
ifstream fin("cowfood.in");
ofstream fout("cowfood.out");
const int DIM=35;
const int VAL=10005;
const int MOD=3210121;
int K, S, N, i, j, ind;
int v[DIM][DIM], last;
int SUM[VAL], conf, nr0;
int SOL, A, X, ANS[DIM];
int COMB[VAL+DIM][DIM];
int main()
{
fin >> K >> S >> N;
for (i=0; i<N; i++)
{
nr0=0;
for (j=1; j<=K; j++)
{
fin >> v[i][j];
if (v[i][j]==0)
nr0++;
}
if (nr0==K)
{
fout << 0 << '\n';
fin.close();
fout.close();
return 0;
}
}
COMB[1][0]=COMB[1][1]=1;
for (i=2; i<=S+K; i++)
{
COMB[i][0]=1;
for (j=1; j<=min(i, K-1); j++)
{
COMB[i][j]=COMB[i-1][j-1]+COMB[i-1][j];
if (COMB[i][j]>=MOD)
COMB[i][j]-=MOD;
}
}
for (i=1; i<=S; i++)
{
SUM[i]=SUM[i-1]+COMB[i+K-1][K-1];
if (SUM[i]>=MOD)
SUM[i]-=MOD;
}
for (conf=1; conf<(1 << N); conf++)
{
ind=0;
for (j=1; j<=K; j++)
ANS[j]=0;
for (i=0; i<N; i++)
{
if ((conf & (1 << i))!=0)
{
ind++;
for (j=1; j<=K; j++)
ANS[j]=max(ANS[j], v[i][j]);
}
}
A=0;
nr0=0;
for (j=1; j<=K; j++)
{
if (ANS[j]==0)
nr0++;
A+=ANS[j];
}
if (A>S)
continue;
X=SUM[S-A];
if (nr0>K-2)
X-=S-A;
else
X++;
if (ind % 2==1)
SOL+=X;
else
SOL-=X;
SOL%=MOD;
if (SOL<0)
SOL+=MOD;
}
SOL=SUM[S]-SOL-K*S;
SOL%=MOD;
if (SOL<0)
SOL+=MOD;
fout << SOL << '\n';
fin.close();
fout.close();
return 0;
}