Pagini recente » Cod sursa (job #2090892) | Cod sursa (job #1191133) | Cod sursa (job #431082) | Cod sursa (job #2983440) | Cod sursa (job #2276429)
#include <cstdio>
#include <algorithm>
#define MOD 3210121
using namespace std;
int k , s , n;
const int NMAX = 20005;
int res=0;
int a[25][35],fact[NMAX],dp[NMAX],imod[NMAX],viz[35],st[35];
int ma[35][35];
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;
}
int combinari(int n,int k)
{
if(n == 0)
return 1;
int temp = (1LL * fact[n] * imod[k]) % MOD;
temp = (1LL * temp * imod[n-k]) % MOD;
return temp;
}
void backt(int nr,int pos)
{
if(nr > 0)
{
for(int i = 1 ; i <= k ; i++)
ma[nr][i] = max(ma[nr-1][i],a[nr][i]);
int sum = 0;
for(int i = 1 ; i <= k ; i++)
sum += ma[nr][i];
if(sum <= s)
{
if(nr & 1)
res = (res + dp[s-sum])%MOD;
else
res = (MOD + res - dp[s-sum])%MOD;
}
}
if(nr < n)
for(int i = pos+1 ; i <= n ; i++)
backt(nr+1,i);
}
int main()
{
freopen("cowfood.in","r",stdin);
freopen("cowfood.out","w",stdout);
fact[0] = 1;
imod[0] = 1;
for (int i = 1; i <= NMAX-5; ++i)
{
fact[i] = (1LL * fact[i - 1] * i) % MOD;
imod[i] = POW(fact[i], MOD - 2);
}
scanf("%d%d%d",&k,&s,&n);
for(int i = 1 ; i <= n ; i++)
for(int j = 1 ; j <= k ; j++)
scanf("%d",&a[i][j]);
dp[0] = 1;
for(int i = 1 ; i <= s ; i++)
dp[i] = (dp[i-1] + combinari(i+k-1,k-1)) % MOD; /// Stars and bars
backt(0,0);
printf("%d",(dp[s]-s*k+MOD-res-1)%MOD);
return 0;
}