Cod sursa(job #1159991)

Utilizator omerOmer Cerrahoglu omer Data 30 martie 2014 00:28:26
Problema Cowfood Scor 14
Compilator cpp Status done
Runda Lista lui wefgef Marime 1.64 kb
#include<stdio.h>
#include<math.h>
#include<algorithm>
const int MOD=3210121, S=10015, K=35, N=25;
using namespace std;
FILE *f,*g;

int comb[S+K];

int a[N][K]; int n,k,s;

int minim[N][K]; int posib;

void read(void){

    f=fopen("cowfood.in","r");
    g=fopen("cowfood.out","w");

    fscanf(f,"%d%d%d",&k,&s,&n);

    int i,j;
    for(i=1; i<=n; i++){

        for (j=1; j<=k; j++){

            fscanf(f,"%d",&a[i][j]);
        }
    }
    
    for(j=1; j<=k; j++) {a[0][j]=0; minim[0][j]=0;}
}

int expo(int n, int t){

    int x;
    if (t==0) return 1;
    else {x=expo(n,t/2); if (t%2 == 0) return ((long long)x*x)%MOD; else { x= ((long long)x*x)%MOD; return ((long long)x*n)%MOD;} }
}

int invers(int n){

    return expo(n,MOD-2);
}

void combinari(void){

    int i;comb[k]=1;
    for(i=k+1;i<=S+K-1;i++){
        comb[i]=((long long)comb[i-1]*i)%MOD;
        comb[i]=((long long)comb[i]*invers(i-k))%MOD;
        
    }
}

int modulo(int x){

    if (x<0) return x+MOD;
    else if (x>=MOD) return x-MOD;
        else return x;
}

void go(int i,bool ok){

    if (i == k) {
        
        int sum=0; int j;
        for(j=1; j<=k ;j++) sum += minim[i][j];
        if (ok) {if (sum <= s) {posib=modulo(posib - comb[s-sum+k]); } }
        else if (sum <= s) {posib=modulo(posib + comb[s-sum+k]); }

    }
    else {
        
        int j;
        for(j=1;j<=k;j++) minim[i+1][j]=minim[i][j];
        go(i+1,ok);

        for(j=1; j<=k; j++) {minim[i+1][j] = max ( minim[i][j], a[i+1][j] ); }
        
        go(i+1,1-ok);

    }
}

int main(void){

   read();

   combinari();

   go(0,0);

   posib=modulo(posib-s*k-1);

   fprintf(g,"%d",posib);

   return 0;
}