Cod sursa(job #2483949)

Utilizator CharacterMeCharacter Me CharacterMe Data 30 octombrie 2019 16:14:43
Problema Diamant Scor 60
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.11 kb

#include <bits/stdc++.h>
#define MOD 10000
#define add 50000
#define rest(a) (a-a/MOD*MOD);
typedef long long ll;
ll n, i, j, m, x, k, mx;
ll list[100001], rep[100001];
int main()
{
    freopen("diamant.in", "r", stdin);
    freopen("diamant.out", "w", stdout);
    scanf("%lld%lld%lld", &n, &m, &x);
    list[0+add]=1;
    mx=m*n*(n+1)*(m+1)/4;
    if(x>=mx || x<=-mx){
        printf("0");
        return 0;
    }
    for(i=1; i<=n; ++i){
        for(j=1; j<=m; ++j){
            for(k=-mx+add; k<=mx+add; ++k){
                if(k-i*j>=0){
                    rep[k-i*j]+=list[k];
                    rep[k-i*j]=rest(rep[k-i*j]);
                }
                rep[k]+=list[k];
                rep[k]=rest(rep[k]);
                if(k+i*j<=100000) {
                    rep[k+i*j]=(rep[k+i*j]+list[k])%MOD;
                    rep[k+i*j]=rest(rep[k+i*j]);
                }
                list[k]=0;
            }
            for(k=-mx+add; k<=mx+add; ++k) {list[k]=rep[k]; rep[k]=0;}
        }
    }
    printf("%lld", list[x+add]);
    fclose(stdin);
    fclose(stdout);
    return 0;
}