Pagini recente » Cod sursa (job #2565877) | Cod sursa (job #1533438) | Cod sursa (job #266426) | Cod sursa (job #1512936) | Cod sursa (job #3220359)
#include <fstream>
#define mod 3210121
using namespace std;
ifstream fin ("cowfood.in");
ofstream fout ("cowfood.out");
int s,sum,i,j,ok,k,dp[10001][32],v[32],sol,n,p[21][32];
void f (int pas,int poz)
{
if (poz==n+1)
{
if (pas==0)
return ;
if (pas%2==0)
ok=-1;
else
ok=1;
int sum=0;
for (int i=1; i<=k; i++)
sum+=v[i];
sum=s-sum;
if (sum>=0)
{
sol+=ok*(dp[sum][k+1]);
while (sol<0)
sol+=mod;
sol%=mod;
}
}
else
{
int x[k+1];
for (int i=1; i<=k; i++)
{
x[i]=v[i];
v[i]=max (v[i],p[poz][i]);
}
f (pas+1,poz+1);
for (int i=1; i<=k; i++)
v[i]=x[i];
f (pas,poz+1);
}
}
int main()
{
fin>>k>>s>>n;
for (i=1; i<=n; i++)
{
for (j=1; j<=k; j++)
fin>>p[i][j];
}
///dp[i][j]=nr de moduri de a pune exact i bile in j cutii
///=> dp[i][j+1]=nr de moduri de a pune maxim i bile in j cutii (cutia j+1=val-i)
for (j=1; j<=k+1; j++)
dp[0][j]=1;
for (j=1; j<=k+1; j++)
dp[1][j]=j;
for (i=1; i<=s; i++)
dp[i][1]=1;
for (i=2; i<=s; i++)
{
for (j=2; j<=k+1; j++)
dp[i][j]=(dp[i][j-1]+dp[i-1][j])%mod;
}
f (0,1);
sol=dp[s][k+1]-sol-1-(s*k)%mod;
while (sol<0)
sol+=mod;
sol%=mod;
fout<<sol;
return 0;
}