Cod sursa(job #2707315)

Utilizator FrostfireMagirescu Tudor Frostfire Data 16 februarie 2021 19:52:19
Problema Cowfood Scor 26
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.21 kb
#include <iostream>
#include <fstream>
#define MOD 3210121
#define ll long long
#define NMAX 2000

using namespace std;

ifstream fin("cowfood.in");
ofstream fout("cowfood.out");

int k, s, n, a[25][35], ans;
ll fact[NMAX+10];

void precalc()
{	fact[0] = 1;
	for(int i=1; i<=NMAX; i++)
		fact[i] = fact[i-1] * i % MOD;
}

ll lgput(ll a, ll n)
{	if(!n) return 1;
	if(n % 2 == 0) return lgput(a*a % MOD, n/2);
	return a * lgput(a*a % MOD, n/2) % MOD;
}

int C(int n, int k)
{	ll val1 = fact[n], val2 = fact[k] * fact[n-k] % MOD;
	return val1 * lgput(val2, MOD - 2) % MOD;
}

int main()
{
	fin >> k >> s >> n;
	precalc();
	for(int i=1; i<=n; i++)
		for(int j=1; j<=k; j++)
			fin >> a[i][j];
	for(int mask=1; mask<(1<<n); mask++)
		{	int cnt = 0, v[35] = {0};
			for(int bit=0; bit<n; bit++)
				if(mask & (1 << bit))
					{	cnt++;
						for(int j=1; j<=k; j++)
							v[j] = max(v[j], a[bit+1][j]);
					}
			int sum = 0;
			for(int i=1; i<=k; i++)
				sum += v[i];
			if(sum > s) continue;
			if(cnt % 2 == 0)
				ans = (ans - C(s - sum + k, k) + MOD) % MOD;
			else
				ans = (ans + C(s - sum + k, k)) % MOD;
		}
	fout << (C(s + k, k) - s * k - 1 - ans + MOD) % MOD << '\n';
	return 0;
}