Pagini recente » Cod sursa (job #3174708) | Cod sursa (job #1744960) | Cod sursa (job #2964277) | Cod sursa (job #2909527) | Cod sursa (job #3219240)
#include <fstream>
using namespace std;
ifstream fin("cowfood.in");
ofstream fout("cowfood.out");
const int mod = 3210121;
const int kmax = 30;
const int smax = 10000;
int n,k,s;
bool bk[kmax + 5];
int a[kmax + 5][kmax + 5];
int d[smax + 5][kmax + 5];
int sol;
int mx[kmax + 5];
int lt[kmax + 5];
void bt(int pas,int nrset = 0)
{
if(pas==n)
{
if(nrset==0)
return;
int smx = 0;
for(int i = 1;i<=k;i++)
smx += mx[i];
if(smx > s)
return;
if(nrset%2)
sol =(sol - d[s-smx][k+1]+mod)%mod;
else
sol =(sol + d[s-smx][k+1])%mod;
return;
}
bt(pas+1,nrset);
bk[pas+1]=1;
for(int j = 1;j<=k;j++){
lt[j]=mx[j];
mx[j]=max(mx[j],a[pas+1][j]);
}
bt(pas+1,nrset+1);
bk[pas+1]=0;
for(int j = 1;j<=k;j++)
mx[j]=lt[j];
}
int main()
{
fin>>k>>s>>n;
for(int i=1;i<=n;i++)
for(int j=1;j<=k;j++)
fin>>a[i][j];
for(int j = 0;j<=k+1;j++)
d[0][j]=1;
for(int i = 1;i<=s+1;i++)
for(int j = 0;j<=k+1;j++)
if(j<=1)
d[i][j] = 1;
else
d[i][j]=(d[i-1][j]+d[i][j-1])%mod;
sol =(sol+ d[s][k+1] - s*k -1 + mod)%mod;
bt(0);
fout<<sol;
}