Cod sursa(job #35036)
#include <stdio.h>
#define dim 45000
int N, M, K;
int A[dim], C[dim], Uz[dim][401];
long X, S, Max;
int main()
{
freopen("diamant.in", "r", stdin);
freopen("diamant.out", "w", stdout);
scanf("%d %d %d", &N, &M, &X);
X *= X < 0 ? -1 : 1;
int i, j, k;
for(i=1; i<=N; ++i)
for(j=1; j<=M; ++j)
{
A[++K] = i * j;
S += i * j;
}
if( X > S )
printf("0");
else
{
for(i=1; i<K; ++i)
for(j=i+1; j<=K; ++j)
if( A[i] > A[j] )
A[i] ^= A[j] ^= A[i] ^= A[j];
Max = 0;
C[0] = 1;
for(i=1; i<=K; ++i)
for(j=Max; j>=0; --j)
if( C[j] )
if( j + A[i] <= S )
{
C[j+A[i]] += C[j];
C[j+A[i]] -= C[j+A[i]] >= 10000 ? 10000 : 0;
for(k=1; k<=K; ++k)
Uz[j+A[i]][k] = Uz[j][k];
Uz[j+A[i]][i] = 1;
if( j + A[i] > Max )
Max = j + A[i];
}
}
// Uz[i][j] -> daca am folosit elenentul j pentru a forma suma i
for(i=1; i<=K; ++i)
for(j=0; j<=Max; ++j)
if( C[j] && j - A[i] >= 0 && !Uz[j][i] )
{
C[j-A[i]] += C[j];
C[j-A[i]] -= C[j-A[i]] >= 10000 ? 10000 : 0;
Uz[j][i] = 1;
}
printf("%d", C[X]);
fclose(stdin);
fclose(stdout);
return 0;
}