Cod sursa(job #2334347)

Utilizator Ruxandra985Nanu Ruxandra Laura Ruxandra985 Data 2 februarie 2019 15:42:11
Problema Cowfood Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.61 kb
#include <cstdio>
#include <iostream>
#define MOD 3210121
using namespace std;
int v[50][50],d[50][10010],w[50],biti[(1<<20)];
int n,k,s,impos;
void back (int pas,int nr){
    if (pas==n){
        /// build sol
        if (!nr || w[0]>s)
            return;
        if (biti[nr]%2==1) /// add la impos /// suma in w[0]
            impos=(impos+d[k][s-w[0]])%MOD;
        else
            impos=(impos-d[k][s-w[0]]+MOD)%MOD;
        return;
    }
    /// setam bitul pas
    /// caz 1: bitul pas ramane 0
    back(pas+1,nr);
    /// caz 2: bitul pas e 1
    int i,aux[31];
    aux[0]=w[0];
    for (i=1;i<=k;i++){
        aux[i]=w[i];
        w[0]-=w[i];
        w[i]=max(w[i],v[pas+1][i]);
        w[0]+=w[i];
    }
    back(pas+1,nr+(1<<pas));
    for (i=0;i<=k;i++)
        w[i]=aux[i];
}
int main()
{
    FILE *fin=fopen ("cowfood.in","r");
    FILE *fout=fopen ("cowfood.out","w");
    int i,j,total;
    fscanf (fin,"%d%d%d",&k,&s,&n);
    for (i=1;i<(1<<n);i++)
        biti[i]=i%2+biti[i/2];
    for (i=1;i<=n;i++){
        for (j=1;j<=k;j++){
            fscanf (fin,"%d",&v[i][j]);
            v[i][0]=(v[i][0]+v[i][j])%MOD; /// suma tuturor
        }
    }
    for (j=0;j<=s;j++)
        d[1][j]=1;
    for (i=2;i<=k;i++){
        d[i][0]=1;
        for (j=1;j<=s;j++){ /// d[i][j] = j bile in i cutii
            d[i][j]=(d[i-1][j]+d[i][j-1])%MOD;
        }
    }
    for (j=1;j<=s;j++)
        d[k][j]=(d[k][j]+d[k][j-1])%MOD;
    total=(d[k][s]-(k*s)%MOD-1 + MOD)%MOD; /// nr total de moduri
    back(0,0);
    fprintf (fout,"%d",(total-impos+MOD)%MOD);
    return 0;
}