Cod sursa(job #2139399)

Utilizator stefanchistefan chiper stefanchi Data 22 februarie 2018 15:18:30
Problema Diamant Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.29 kb
#include <cstdio>

using namespace std;
const int lim = 88200;
const int Modulo = 10000;
int x,greutate;
int sirelemente[405];
int dp[2][lim+5];


void preparation(int n , int m)
{
    dp[0][lim/2] = 1;
    int aux = 1;
    for(int i = 1 ; i <= n ; i++)
        for(int j = 1; j <= m ; j++)
            sirelemente[aux++]=i*j;
}

void backpack(int limita)
{
    int switchline = 1;
    int calitate = 0;
    for(int i = 1; i <= limita; i++)
    {

        for(int k = 0 ; k <= lim ;k++)
        {
            calitate = dp[!switchline][k] + dp[switchline][k];
            if(k - sirelemente[i] >= 0)
                calitate += dp[!switchline][k-sirelemente[i]];
            if(k + sirelemente[i] <= limita)
                calitate += dp[!switchline][k + sirelemente[i]];

            dp[switchline][k] = calitate%Modulo;
        }
        switchline = !switchline;
    }
}



int main()
{
    int n,m;
    freopen("diamant.in","r",stdin);
    freopen("diamant.out","w",stdout);
    scanf("%d %d %d",&n,&m,&x);
    greutate = (n * (n + 1) / 2) * (m * (m + 1 ) / 2);
    if(x > greutate || x < -greutate)
    {
        printf("0\n");
        return 0;
    }
    preparation(n,m);
    backpack(n*m);
    printf("%d\n",dp[(n*m)%2][x  + (lim/2) - 1]);
    return 0;
}