#include <fstream>
#include <climits>
using namespace std;
const int MOD = 3210121;
ifstream in;
ofstream ou;
short k, s, n, experiment[25][35], pascal[35][35];
int starsandbars(int bars, int stars)
{
return pascal[stars + bars][bars];
}
int main()
{
pascal[1][1] = 1;
for (int i = 2; i < 35; i++)
{
pascal[i][1] = pascal[i][i] = 1;
for (int j = 2; j < i; j++)
{
pascal[i][j] = pascal[i-1][j] + pascal[i-1][j-1];
pascal[i][j] %= MOD;
}
}
in.open("cowfood.in");
ou.open("cowfood.out");
in >> k >> s >> n;
for (short i = 0; i < n; i++)
{
for (short j = 0; j < k; j++)
{
in >> experiment[i][j];
}
}
int r = 0;
for (int bitmask = 0; bitmask < (1 << n); bitmask++)
{
int sumaleft = s; bool aditie = 1;
for (int cur = 0; cur < n; cur++)
{
if ((bitmask >> cur) & 1)
aditie = !aditie;
}
for (int mancare = 0; mancare < k; mancare++)
{
short chestie = 0;
for (int cur = 0; cur < n; cur++)
{
if ((bitmask >> cur) & 1)
chestie = max(chestie, experiment[cur][mancare]);
}
sumaleft -= chestie;
}
if (sumaleft < 0)
continue;
// ou << bitmask << ": " << sumaleft << " " << k << " " << (aditie?"+":"-") << starsandbars(sumaleft, k) << "\n";
if (aditie)
{
r += starsandbars(sumaleft, k);
r %= MOD;
}
else
{
r -= starsandbars(sumaleft, k);
r += MOD;
r %= MOD;
}
}
r--; // intersect
r -= (s-1) * k; // k axes, all s length, -1 for intersect (added once above)
r += MOD;
r %= MOD;
ou << r << "\n";
return 0;
}