Pagini recente » Cod sursa (job #1863854) | Cod sursa (job #2162865) | Cod sursa (job #1956712) | Cod sursa (job #1780522) | Cod sursa (job #2611708)
#include <fstream>
using namespace std;
ifstream fin("cowfood.in");
ofstream fout("cowfood.out");
const int MOD = 3210121, NMax = 20, KMax = 30, SMax = 10000;
int V[NMax + 5], N, K, S, A[NMax + 5][KMax + 5], DP[SMax + 5][KMax + 5], Maxi[NMax + 5][KMax + 5], W[NMax], Sol;
bool Use[NMax + 5];
int Stars_and_Bars(int stars, int bars = K)
{
if(stars < 1)
return 0;
return DP[stars - 1][bars - 1];
}
int Shrink(int x)
{
if(x >= MOD)
x -= MOD;
return x;
}
void Process(int len, int Sum)
{
if(len & 1)
Sol = Shrink(Sol + Stars_and_Bars(S - Sum + K));
else
Sol = Shrink(Sol + MOD - Stars_and_Bars(S - Sum + K));
}
void BKT(int pos)
{
for(int i = V[pos - 1] + 1; i <= N; i++)
{
if(Use[i]) continue;
V[pos] = i;
Use[i] = true;
for(int k = 1; k <= K; k++)
{
Maxi[pos][k] = max(Maxi[pos - 1][k], A[i][k]);
W[pos] += Maxi[pos][k];
}
Process(pos, W[pos]);
if(pos < N)
BKT(pos + 1);
Use[i] = false;
W[pos] = 0;
}
}
void Precalc()
{
for(int i = 0; i <= S; i++)
DP[i][0] = 1;
for(int i = 1; i <= S; i++)
for(int j = 1; j <= K; j++)
DP[i][j] = Shrink(DP[i - 1][j] + DP[i - 1][j - 1]);
for(int i = 1; i <= S; i++)
for(int j = 0; j <= K; j++)
DP[i][j] = Shrink(DP[i - 1][j] + DP[i][j]);
}
int main()
{
fin >> K >> S >> N;
for(int i = 1; i <= N; i++)
for(int j = 1; j <= K; j++)
fin >> A[i][j];
Precalc();
BKT(1);
fout << Shrink(Stars_and_Bars(S) + MOD - Sol) << '\n';
fin.close();
fout.close();
return 0;
}