Cod sursa(job #2259275)

Utilizator Dobricean_IoanDobricean Ionut Dobricean_Ioan Data 13 octombrie 2018 11:15:04
Problema Cowfood Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.58 kb
#include <fstream>
 
using namespace std;
 
ifstream fin ( "cowfood.in" );
ofstream fout ( "cowfood.out" );
 
const int Dim = 20001,mod = 3210121;
int fact[Dim],imod[Dim],A[21][31],k,n,s,P[31],res,SP[Dim];
int Max[30][31];
 
void Calc(int n);
int Comb(int n, int k);
void PINEX(int nr,int poz);
 
 
int main() {
	
	Calc(Dim - 1);
	fin >> k >> s >> n;
	for ( int i = 1; i <= n; ++i)
		for ( int j = 1; j <= k; ++j)
			fin >> A[i][j];
	SP[0] = 1;
	for ( int i = 1; i <= s; ++i)
		SP[i] = (SP[i-1] + Comb(i + k - 1, k - 1)) % mod;
	PINEX(0,0);
	fout << (SP[s] - s * k + mod - res - 1) % mod << "\n";
}
 
void PINEX(int nr,int poz) {
	
	if ( nr ) {
	for ( int i = 1; i <= k ; ++i)
			Max[nr][i] = max(Max[nr - 1][i],A[poz][i]);
	int sum = 0;
	for ( int i = 1; i <= k; ++i)
		sum += Max[nr][i];
	if ( sum <= s) {
			if ( nr & 1 )
				res  = (res + SP[s-sum]) % mod;
			else
				res = ( mod + res - SP[s-sum] ) % mod;
		} 
	}
	if ( nr < n )
		for ( int i = poz + 1; i <= n; ++i)
			PINEX(nr + 1, i);
}
int Pow(int x, int n)
    {
        if ( n == 0 ) return 1;
        int res = Pow(x, n / 2);
        res = (1LL * res * res) % mod;
        if ( n % 2 == 1 )
            res = (1LL * res * x) % mod;
        return res;
    }
void Calc(int n) {
       
        fact[0] = 1;
        imod[0] = 1;
        for (int i = 1; i <= n; ++i) {
            fact[i] = (1LL  * fact[i - 1] * i) % mod;
          imod[i] = Pow(fact[i], mod - 2);
          }
}
int Comb(int n, int k) {
    int cmb = 1;
    if ( n == 0)
        return 1;
    cmb = (1LL * fact[n] * imod[k]) % mod;
    cmb = (1LL * cmb * imod[n-k]) % mod;
    return cmb;
}