Pagini recente » Cod sursa (job #1830492) | Cod sursa (job #100412) | Cod sursa (job #1640639) | Cod sursa (job #2449183) | Cod sursa (job #1754459)
#include <iostream>
#include <fstream>
using namespace std;
ifstream f("cowfood.in");
ofstream g("cowfood.out");
const int MOD = 3210121;
int K, S, N, V, E;
int M[21][31], x[21], MAX[21][31], si[21];
int card(int S, int K, int q) {
int sum = 0;
for(int i = q; i <= S; i++) {
int comb = 1;
for(int j = 1; j < K; j++)
comb = (comb * (i + j) / j);
sum += comb;
sum %= MOD;
}
return sum;
}
void maxv(int A[], int B[], int C[]) {
for(int i = 1; i <= K; i++)
C[i] = max(A[i], B[i]);
}
void gen_comb(int n, int m) {
int k = 1;
x[1] = 0;
long long semn;
if(m % 2 != 0) semn = 1;
else semn = -1;
while(k > 0)
if(x[k] < n - m + k) {
x[k]++;
maxv(MAX[k - 1], M[k], MAX[k]);
if(k == m) {
int D = S;
for(int i = 1; i <= K; i++)
D -= MAX[m][i];
int t = MOD + semn * card(D, K, 0);
E += t;
E %= MOD;
}
else {
k++;
x[k] = x[k - 1];
}
}
else
k--;
}
int main() {
f >> K >> S >> N;
V = card(S, K, 2) - (S - 1) * K;
for(int i = 1; i <= N; i++)
for(int j = 1; j <= K; j++)
f >> M[i][j];
for(int i = 1; i <= N; i++)
gen_comb(N, i);
//cout << V << ' ' << E;
V -= E;
if(V < 0)V += MOD;
g << V;
return 0;
}