Pagini recente » Borderou de evaluare (job #2024166) | Borderou de evaluare (job #2823218) | Cod sursa (job #1960312) | Cod sursa (job #1603458) | Cod sursa (job #2508377)
#include <fstream>
#include <vector>
using namespace std;
ifstream fin( "diamant.in" );
ofstream fout( "diamant.out" );
const int MOD = 10000;
const int DIF = 50000;
int N, M, X;
void Read()
{
fin >> N >> M >> X;
}
void Do()
{
int mx = 0;
for( int i = 1; i <= N; ++i )
for( int j = 1; j <= M; ++j )
mx += i * j;
if( X > mx || X < - mx ) { fout << 0 << '\n'; return; }
int dp[2][100005] = { 0 };
int prev, curr;
vector <int> val;
prev = 0; curr = 1;
for( int i = 1; i <= N; ++i )
for( int j = 1; j <= M; ++j )
val.push_back( i * j );
dp[curr][DIF] = dp[curr][ DIF - val[0] ] = dp[curr][ DIF + val[0] ] = 1;
for( int i = 1; i < val.size(); ++i )
{
swap( curr, prev );
for( int j = 0; j <= 2 * DIF; ++j )
{
if( j - val[i] > 0 ) dp[curr][j] += dp[prev][j - val[i]];
if( j + val[i] < 2 * DIF ) dp[curr][j] += dp[prev][j + val[i]];
dp[curr][j] += dp[prev][j];
dp[curr][j] %= MOD;
}
}
fout << dp[curr][X + DIF] << '\n';
}
int main()
{
Read();
Do();
return 0;
}