Pagini recente » Cod sursa (job #1027151) | Cod sursa (job #190151) | Cod sursa (job #220041) | Cod sursa (job #2675546) | Cod sursa (job #1550920)
#include<bits/stdc++.h>
using namespace std;
ifstream fin("cowfood.in");
ofstream fout("cowfood.out");
const int MODULO=3210121;
const int SMAX=10050;
const int NMAX=21;
const int KMAX=31;
int k,s,n,a[NMAX][KMAX],mn[KMAX];
int comb[SMAX][KMAX],part[SMAX];
int aux[NMAX][KMAX],sum[NMAX];//maxime partiale
int sol;
void Back(int poz,int cnt)
{
if (sum[poz-1]>s) return;//nu are rost
if (poz==n+1)
{
if (cnt&1) sol-=part[s-sum[poz-1]];
else if (cnt) sol+=part[s-sum[poz-1]];
if (sol<0) sol+=MODULO;
if (sol>=MODULO) sol-=MODULO;
}
else
{
int i;
sum[poz]=sum[poz-1];
for (i=1;i<=k;i++) aux[poz][i]=aux[poz-1][i];
Back(poz+1,cnt);
sum[poz]=0;
for (i=1;i<=k;i++) aux[poz][i]=max(aux[poz-1][i],a[poz][i]),sum[poz]+=aux[poz][i];
Back(poz+1,cnt+1);
}
}
int main()
{
int i,j,ok=0,cnt;
fin>>k>>s>>n;
for (i=1;i<=k;i++) mn[i]=1<<30;
for (i=1;i<=n;i++)
{
cnt=0;
for (j=1;j<=k;j++)
{
fin>>a[i][j];
if (a[i][j]) cnt++;
}
if (cnt==0) ok=1;
if (cnt==1)
for (j=1;j<=k;j++)
if (a[i][j])
mn[j]=min(mn[j],a[i][j]);
}
comb[0][0]=1;
for (i=1;i<(s+k);i++)
{
comb[i][0]=1;
for (j=1;j<k;j++)
{
comb[i][j]=comb[i-1][j]+comb[i-1][j-1];
if (comb[i][j]>=MODULO) comb[i][j]-=MODULO;
}
}
part[0]=1;
for(i=1;i<=s;i++) part[i]=(part[i-1]+comb[i+k-1][k-1])%MODULO;
sol=part[s];
Back(1,0);
if (ok==0) sol--;//0 full
for (i=1;i<=k;i++)
{
if (mn[i]==(1<<30)) mn[i]=s+1;
if (mn[i]) sol-=mn[i]-1;
}
if (sol<0) sol+=MODULO;
fout<<sol<<"\n";
return 0;
}