Pagini recente » Cod sursa (job #1768110) | Cod sursa (job #712424) | Cod sursa (job #2837705) | Cod sursa (job #1019563) | Cod sursa (job #1910438)
#include <fstream>
using namespace std;
ifstream fin("cowfood.in");
ofstream fout("cowfood.out");
typedef long long i64;
const int kmax= 30;
const int nmax= 20;
const int smax= 10000;
const int mod= 3210121;
int n, k, sum;
int d[smax+1][kmax+1], s[smax+1], v[nmax+1][kmax+1], ms[nmax+1][kmax+1];
i64 ans;
void back( int x, int sg ) {
if ( x==n+1 ) {
int aux= sum;
for ( int i= 1; i<=k; ++i ) {
aux= aux-ms[x-1][i];
}
ans= ((ans+max(0, s[aux])*sg)%mod+mod)%mod;
} else {
for ( int i= 1; i<=k; ++i ) {
ms[x][i]= ms[x-1][i];
}
back(x+1, sg);
for ( int i= 1; i<=k; ++i ) {
ms[x][i]= max(ms[x-1][i], v[x][i]);
}
back(x+1, -sg);
}
}
int main( ) {
fin>>k>>sum>>n;
for ( int i= 1; i<=n; ++i ) {
for ( int j= 1; j<=k; ++j ) {
fin>>v[i][j];
}
}
for ( int i= 0; i<=smax; ++i ) {
d[i][0]= 1;
for ( int j= 1; j<=i && j<=kmax; ++j ) {
d[i][j]= (d[i-1][j-1]+d[i-1][j])%mod;
}
}
s[0]= 1;
for ( int i= 1; i<=sum; ++i ) {
s[i]= (d[i+k-1][k-1]+s[i-1])%mod;
}
back(1, 1);
ans= ((ans-sum*k-1)%mod+mod)%mod;
fout<<ans<<"\n";
return 0;
}