Cod sursa(job #2179152)

Utilizator flibiaVisanu Cristian flibia Data 19 martie 2018 23:14:36
Problema Diamant Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.91 kb
#pragma GCC optimize("03")
#include <bits/stdc++.h>
#define mod 10000

using namespace std;

ifstream in("diamant.in");
ofstream out("diamant.out");

int n, m, x, mx, dp[2][1 << 18], u, cur;

int main(){
	in >> n >> m >> x;
	for(int i = 1; i <= n; i++)
		for(int j = 1; j <= m; j++)
			mx += i * j;
	if(x > mx || x < -mx)
		return out << 0, 0;
	int MOD = mx;
	int sz = 2 * mx;
	dp[0][0 + MOD] = dp[0][-1 + MOD] = dp[0][1 + MOD] = 1;
	u = 1;
	cur = 1;
	for(int i = 1; i <= n; i++)
		for(int j = 1; j <= m; j++){
			if(i == 1 && j == 1)
				continue;
			int val = i * j;
			cur += val;
			for(int sum = MOD - cur; sum <= cur + MOD; ++sum){
				dp[u][sum] = (dp[u][sum] + dp[!u][sum]) % mod;
				dp[u][sum + val] = (dp[u][sum + val] + dp[!u][sum]) % mod;
				dp[u][sum - val] = (dp[u][sum - val] + dp[!u][sum]) % mod;
				dp[!u][sum] = 0; 
			}
			u = !u;
		}
	out << dp[!u][x + MOD];
	return 0;
}