Cod sursa(job #180849)

Utilizator DorinOltean Dorin Dorin Data 17 aprilie 2008 16:34:11
Problema Cowfood Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.4 kb
# include <stdio.h>
# include <cstring>

using namespace std;

# define input "cowfood.in"
# define output "cowfood.out"
# define maxk 32
# define maxn 22
# define maxs 10004

# define maxim(a,b) (a>b?a:b)

int a[maxn][maxk],t[maxk][maxs];
int i, j, n, k, s;
int v[21], nr, ret;

# define mod 3210121

void back(int K)
{
     if ( K == n + 1)
     {
          int e = s;
		  for(i = 1; i<=k;i++)
				e-=v[i];
		  if(e < 0) return;
		  if(!(nr&1))
		  {
				  ret+=t[k][e];
				  if(ret >= mod)     ret-=mod;
		  }
		  else
		  {
			  ret-=t[k][e];
              if(ret < 0)     ret += mod;
          }
     }
     else
     {
         back(K+1);
         nr++;
         int v1[21];
         for(i = 1; i <= n; i++)
               v1[i] = v[i],v[i] = maxim(v[i],a[K][i]);
         back(K+1);
         memcpy(v,v1,sizeof(v1));
         nr--;
     }
}

int main()
{
    freopen(input, "r", stdin);
    freopen(output, "w", stdout);

	scanf("%d %d %d",&k,&s,&n);
    for(i = 1; i<= n;i++)
          for(j = 1; j <= k; j++)
                scanf("%d ",&a[i][j]);
                
    for(i = 1; i <= s; i++)
		  t[0][i] = 1;
	for(i = 1;i <= k; i++)
		  t[i][0] =1;
	for(i = 1; i <= k; i++)
		  for(j = 1; j <= s; j++)
				t[i][j] = (t[i-1][j] + t[i][j-1])%mod;
				
	back(1);
	ret-=k*s+1;
	if(ret < 0) ret+=mod;
    
    printf("%d",ret);
    
    return 0;
}