Cod sursa(job #2071405)

Utilizator silkMarin Dragos silk Data 20 noiembrie 2017 17:36:17
Problema Cowfood Scor 24
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.88 kb
#include <bits/stdc++.h>
#define MOD 3210121
#define MaxC 184756
#define MaxS 10000
#define MaxK 30
#define MaxN 20
using namespace std;

int v[2][MaxC+1][MaxK+1];
int a[MaxN+1][MaxK+1];
int last[MaxC+1];
int good[MaxS+1];
int dp[MaxS+1];

int main(){
    FILE* fin = fopen("cowfood.in","r");
    FILE* fout = fopen("cowfood.out","w");

    int i,j,k,l,step,temp,res,K,S,N,M,P;

    fscanf(fin,"%d %d %d",&K,&S,&N);

    for(i = 0; i <= S; ++i) dp[i] = 1;
    for(i = 2; i <= K; ++i)
        for(j = 1; j <= S; ++j)
        dp[j] = (dp[j-1] + dp[j]) % MOD;

    for(i = 1; i <= S; ++i) good[i] = (dp[i] - K + MOD) % MOD;
    for(i = 2; i <= S; ++i) good[i] = (good[i] + good[i-1]) % MOD;
    for(i = 1; i <= S; ++i) dp[i] = (dp[i] + dp[i-1]) % MOD;
    if(!N) fprintf(fout,"%d\n",good[S]);
    else{
        for(i = 1; i <= N; ++i)
            for(j = 1; j <= K; ++j)
            fscanf(fin,"%d",&a[i][j]);

        M = N;
        l = res = 0;
        for(i = 1; i <= N; ++i) last[i] = i;
        for(i = 1; i <= N; ++i)
        {
            temp = 0;
            for(j = 1; j <= K; ++j) v[0][i][j] = a[i][j], temp += a[i][j];
            if(temp <= S) res = (res + dp[S-temp]) % MOD;
        }

        for(step = 2; step <= N; ++step, l = 1 - l)
        {
            P = 0;
            for(i = 1; i <= M; ++i)
                for(j = last[i] + 1; j <= N; ++j)
                {
                    last[++P] = j;
                    for(k = 1; k <= K; ++k) v[1-l][P][k] = max(v[l][i][k], a[j][k]);
                }

            for(i = 1; i <= P; ++i)
            {
                temp = 0;
                for(j = 1; j <= K; ++j) temp += v[1-l][i][j];
                if(temp <= S) res = (res + (step % 2 ? 1 : -1) * dp[S-temp] + MOD) % MOD;
            }
        }

        fprintf(fout,"%d\n",(good[S] - res + MOD) % MOD);
    }


return 0;
}