Cod sursa(job #1499338)

Utilizator greenadexIulia Harasim greenadex Data 10 octombrie 2015 15:16:31
Problema Diamant Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.99 kb
#include <bits/stdc++.h>
#define pb push_back
#define f first
#define s second
#define pii pair<int, int>
#define mp make_pair

using namespace std;

const int mod = 1e4;
int MAX, n, m, k, curr, ant, dp[2][100005];

int main() {

	freopen("diamant.in", "r", stdin);
	freopen("diamant.out", "w", stdout);

	scanf("%d%d%d", &n, &m, &k);

	MAX = n * (n + 1) * m * (m + 1) / 4;


	if (MAX < k || -MAX > k) {
		printf("0");
		return 0;
	}

	dp[0][MAX] = 1;

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

			curr = 1 - curr;

			for (int sum = 0; sum <= 2 * MAX; sum++) {
				dp[curr][sum] = dp[1 - curr][sum];
				if (sum >= i * j && dp[1 - curr][sum - i * j]) {
					dp[curr][sum] += dp[1 - curr][sum - i * j];
					dp[curr][sum] -= (dp[curr][sum] >= mod ? mod : 0);
				}
				if (sum + i * j <= 2 * MAX && dp[1 - curr][sum + i * j]) {
					dp[curr][sum] += dp[1 - curr][sum + i * j];
					dp[curr][sum] -= (dp[curr][sum] >= mod ? mod : 0);
				}
			}
		}

	printf("%d", dp[curr][k + MAX]);

	return 0;
}