Pagini recente » Cod sursa (job #1568333) | Cod sursa (job #441382) | Cod sursa (job #2552380) | Cod sursa (job #1158925) | Cod sursa (job #773516)
Cod sursa(job #773516)
#include <iostream>
#include <fstream>
using namespace std;
ifstream f("diamant.in");
ofstream g("diamant.out");
#define Xmax 45000
#define MOD 10000
int prec[2*Xmax];
int acum[2*Xmax];
#define prec (prec + Xmax)
#define acum (acum + Xmax)
int n, m, X;
int main(){
//X -ul poate fi maxim 45000 sau -45000 (aproximativ);cel mai rau caz e de genul 1*1+..+1*m + 2*1+...+2*m + ... n*1+..n*m(pun doar 1 sau -1)
/*
int s = 0;
for(int i=1; i<=20; i++){
for(int j=1; j<=20; j++){
s += i*j;
}
}
cout << s << "\n";
*/
f >> n >> m >> X;
if (X < -Xmax || X > Xmax){
g << 0 << "\n";
return 0;
}
//iau fiecare pozitie si pun -1 0 sau 1; punanad valoarea asta obtin -i*j, 0, sau i*j si cu astea valoare continui tot ce am obtinut pana acum
for(int i=-Xmax+1; i<=Xmax-1; i++) prec[i] = 0, acum[i] = 0;
prec[0] = 1;
acum[0] = 0;
int st = 0;
int dr = 0;
for(int i=1; i<=n; i++){
for(int j=1; j<=m; j++){
st += -i*j;
dr += i*j;
for(int k=st; k<=dr; k++) acum[k] = prec[k];//%MOD;//pun 0;
for(int k=st; k<=dr; k++){
if ( k+i*j <= Xmax-1){
acum[k+i*j] += prec[k];//pun -1;
if (acum[k+i*j] >= MOD)
acum[k+i*j] -= MOD;
}
if (k-i*j >= -Xmax+1){
acum[k-i*j] += prec[k];//pun 1;
if (acum[k-i*j] >= MOD)
acum[k-i*j] -= MOD;
}
}
for(int k=st; k<=dr; k++){
prec[k] = acum[k];// % MOD;
}
}
}
g << acum[X] << "\n";
}