Pagini recente » Cod sursa (job #2336441) | Cod sursa (job #2087913) | Cod sursa (job #2032731) | Cod sursa (job #3179931) | Cod sursa (job #2216495)
#include <fstream>
using namespace std;
ifstream fin ( "cowfood.in" );
ofstream fout ( "cowfood.out" );
const int Dim = 20001,mod = 3210121;
int fact[Dim],imod[Dim],A[21][31],k,n,s,P[31],res;
int Max[30][31];
void Calc(int n);
int Comb(int n, int k);
void PINEX(int nr,int poz);
int main() {
Calc(Dim - 1);
fin >> k >> s >> n;
for ( int i = 1; i <= n; ++i)
for ( int j = 1; j <= k; ++j)
fin >> A[i][j];
PINEX(0,0);
for ( int i = 1; i <= s; ++i)
res = (res + Comb(i + k - 1, k- 1) ) % mod;
fout << (res - s * k + mod ) % mod << "\n";
}
void PINEX(int nr,int poz) {
if ( nr ) {
for ( int i = 1; i <= k ; ++i)
Max[nr][i] = max(Max[nr - 1][i],A[poz][i]);
int sum = 0;
for ( int i = 1; i <= k; ++i)
sum += Max[nr][i];
if ( sum <= s) {
if ( !(nr & 1) )
res = (res + (Comb(s - sum + k - 1, k - 1) + 1)) % mod;
else
res = ( mod + res - Comb(s-sum + k - 1, k - 1) - 1) % mod;
}
}
if ( nr < n )
for ( int i = poz + 1; i <= n; ++i)
PINEX(nr + 1, i);
}
int Pow(int x, int n)
{
if ( n == 0 ) return 1;
int res = Pow(x, n / 2);
res = (1LL * res * res) % mod;
if ( n % 2 == 1 )
res = (1LL * res * x) % mod;
return res;
}
void Calc(int n) {
fact[0] = 1;
imod[0] = 1;
for (int i = 1; i <= n; ++i) {
fact[i] = (1LL * fact[i - 1] * i) % mod;
imod[i] = Pow(fact[i], mod - 2);
}
}
int Comb(int n, int k) {
int cmb = 1;
if ( n == 0)
return 1;
cmb = (1LL * fact[n] * imod[k]) % mod;
cmb = (1LL * cmb * imod[n-k]) % mod;
return cmb;
}