Cod sursa(job #2458841)

Utilizator Senth30Denis-Florin Cringanu Senth30 Data 21 septembrie 2019 16:55:51
Problema Diamant Scor 60
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.68 kb
#include <bits/stdc++.h>
#define MAX 131072

using namespace std;
const int NMAX = 45000;
const int MOD = 10000;

FILE *IN, *OUT;

int N, M, X, nrMax;
int dp[2][NMAX];

int pos, sign;
char f[MAX];

inline int modulo(int x){
    if(x > MOD)
        x -= MOD;
    return x;
}

inline void Read(int &nr){
    sign = 0;
    nr = 0;
    while(f[pos] < '0' || f[pos] > '9'){
        if(f[pos] == '-') sign = 1;
        pos++;
        if(pos == MAX)
            fread(f, MAX, 1, IN), pos = 0;
    }
    while(f[pos] >= '0' && f[pos] <= '9'){
        nr = 10 * nr + f[pos++] - '0';
        if(pos == MAX)
            fread(f, MAX, 1, IN), pos = 0;
    }
    if(sign) nr =- nr;
}

int main(){

    IN = fopen("diamant.in", "r");
    freopen("diamant.out", "w", stdout);

    Read(N); Read(M); Read(X);
    if(X < 0) X *= -1;
    if(X > 44100){
        printf("0");
        return 0;
    }

    nrMax = 1;
    dp[0][0] = 1;
    for(int i = 1; i <= N; i++){
        for(int j = 1; j <= M; j++){
            int cnt = i * j;
            int pMax = nrMax;
            for(int k = 0; k <= nrMax; k++){
                if(cnt >= k)
                    dp[1][cnt - k] = modulo(dp[1][cnt - k] + dp[0][k]);
                else dp[1][k - cnt] = modulo(dp[1][k - cnt] + dp[0][k]);
                dp[1][cnt + k] = modulo(dp[1][cnt + k] + dp[0][k]);
                if(cnt + k > pMax) pMax = cnt + k;
            }
            nrMax = pMax;
            for(int k = 0; k <= nrMax; k++){
                dp[0][k] = modulo(dp[0][k] + dp[1][k]);
                dp[1][k] = 0;
            }
        }
    }
    dp[0][0] *= 2;
    printf("%d", dp[0][X] / 2);

    return 0;
}