Cod sursa(job #1772453)

Utilizator PaulCbnCiobanu Paul PaulCbn Data 6 octombrie 2016 19:15:33
Problema Diamant Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.19 kb
#include <iostream>
#include <cstdio>
#define NMAX 21
#define SMAX 100000
using namespace std;

int N,M,X;
int dp[2][SMAX],a[NMAX][NMAX];
int v[NMAX*NMAX],k;
int Smin,Smax;

void citire()
{
    scanf("%d%d%d",&N,&M,&X);
}

void calcS()
{
    for(int i=1; i<=N; i++)
        for(int j=1; j<=M; j++)
        {
            Smax += i*j;
            v[++k]=i*j;
        }
    Smin = -Smax;

}


void rezolva()
{
    if(X<Smin || X>Smax)
    {
        printf("0\n");
        return;
    }
    int target = X - Smin;

    dp[0][0]=1;
    dp[1][0]=1;

    int I=1;
    for(int i=1; i<=k; i++)
    {
        for(int j=1; j<=target; j++)
        {
            int s = 0;
            s += dp[I^1][j];
            if(j-v[i]>=0)
                s+=dp[I^1][j-v[i]];
            if(j-2*v[i]>=0)
                s+=dp[I^1][j-2*v[i]];
            dp[I][j] = s%10000;
        }

        I=I^1;
    }
    //dp[i][j] = (dp[i-1][j] + dp[i-1][j-v[i]] + dp[i-1][j-2*v[i]])%10000;
    printf("%d\n",dp[I^1][target]);

}

int main()
{
    freopen("diamant.in","r",stdin);
    freopen("diamant.out","w",stdout);
    citire();
    calcS();
    rezolva();

    return 0;
}