Pagini recente » Cod sursa (job #235286) | Cod sursa (job #2507717) | Cod sursa (job #2650688) | Cod sursa (job #1192886) | Cod sursa (job #2809352)
#include <fstream>
using namespace std;
ifstream fin ("cowfood.in");
ofstream fout ("cowfood.out");
int const N = 2e4 + 7 , mod = 3210121;
int k , s , n , v [21][31], now [31] , cnow [31] , dp [N][31] , total;
int maxi [(1 << 20)][31] , sum [(1 << 20)];
void add (int &x , int y){
x += y;
if (x >= mod)
x -= mod;
if (x < 0)
x += mod;
}
void precalc (){
dp [0][0] = 1;
for(int i = 0 ; i < N - 1 ; ++ i){
for(int j = 0 ; j <= min (k , i) ; ++ j){
if (i)
add (dp [i][j] , dp [i - 1][j]);
if (i && j)
add (dp [i][j] , dp [i - 1][j - 1]);
}
}
}
void read (){
fin >> k >> s >> n;
for(int i = 0 ; i < n ; ++ i)
for(int j = 0 ; j < k ; ++ j)
fin >> v [i][j];
}
bool viz [21];
int Cnt;
void bkt (int strat){
int sum = 0;
for(int i = 0 ; i < k ; ++ i)
sum += now [i];
if (sum > s)
return;
if (strat == n){
if (sum < 2)
return;
if (Cnt & 1)
add (total , -dp [s - sum + k][k]);
else
add (total , dp [s - sum + k][k]);
return;
}
int thisone [31];
for(int i = 0 ; i < k ; ++ i)
thisone [i] = now [i];
bkt (strat + 1);
++ Cnt;
for(int i = 0 ; i < k ; ++ i)
now [i] = max (now [i] , v [strat][i]);
bkt (strat + 1);
-- Cnt;
copy (thisone , thisone + k , now);
}
int main()
{
read ();
precalc ();
add (total , dp [s + k][k] - k * s - 1);
bkt (0);
fout << total << '\n';
fin.close ();
fout.close ();
return 0;
}