Cod sursa(job #1722144)

Utilizator fanache99Constantin-Buliga Stefan fanache99 Data 27 iunie 2016 14:17:15
Problema Cowfood Scor 100
Compilator cpp Status done
Runda Lista lui wefgef Marime 1.71 kb
#include<cstdio>
#define MAXN 35
#define MAXS 10110
#define MOD 3210121
using namespace std;
int k,s,n;
int a[MAXN][MAXN],combinations[MAXS][MAXN],v[MAXN],sum=0,previous[MAXN][MAXN];
int minimum(int x,int y){
    if(x<y)
        return x;
    return y;
}
int maximum(int x,int y){
    if(x>y)
        return x;
    return y;
}
void Backtracking(int level,int sign){
    int i,current;
    if(level==n+1){
        if(sign==0)
            return;
        current=s+k;
        for(i=1;i<=k;i++)
            current-=v[i];
        if(current<k)
            return;
        if(sign%2==1){
            sum=sum+combinations[current][k];
            if(sum>=MOD)
                sum-=MOD;
        }
        else{
            sum=sum-combinations[current][k];
            if(sum<0)
                sum+=MOD;
        }
        return;
    }
    Backtracking(level+1,sign);
    for(i=1;i<=k;i++){
        previous[level][i]=v[i];
        v[i]=maximum(v[i],a[level][i]);
    }
    Backtracking(level+1,sign+1);
    for(i=1;i<=k;i++)
        v[i]=previous[level][i];
}
int main(){
    freopen("cowfood.in","r",stdin);
    freopen("cowfood.out","w",stdout);
    int i,j,answer;
    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=0;i<=s+k;i++)
        combinations[i][0]=1;
    for(i=1;i<=s+k;i++)
        for(j=1;j<=minimum(i,k);j++){
            combinations[i][j]=combinations[i-1][j]+combinations[i-1][j-1];
            if(combinations[i][j]>=MOD)
                combinations[i][j]-=MOD;
        }
    Backtracking(1,0);
    answer=((combinations[s+k][k]-sum-s*k-1)%MOD+MOD)%MOD;
    printf("%d",answer);
    return 0;
}