Cod sursa(job #935444)

Utilizator rudarelLup Ionut rudarel Data 3 aprilie 2013 14:49:59
Problema Cowfood Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.55 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[31], 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[31];
         for(i = 1; i <= k; 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;
}