Cod sursa(job #7293)

Utilizator victorsbVictor Rusu victorsb Data 21 ianuarie 2007 13:21:34
Problema 1-sir Scor 10
Compilator cpp Status done
Runda preONI 2007, Runda 1, Clasele 11-12 Marime 1.33 kb
#include <cstdio>
#include <string.h>
#define Nmax 16*4 
#define Smax 16*16*2
#define sum(x) (x)+200
#define nr(x) (x)+16

int n, i, j, s, k, s1, s2, sol;
int d[Nmax][Nmax][Smax];

void citire()
{
    scanf("%d %d\n", &n, &s);
}

void solve()
{
    memset(d,0,sizeof(d));
    d[1][nr(0)][sum(0)] = 1;
    s1 = - (s2 = n*(n-1)/2);
    //printf("%d %d\n", sum(s1), sum(s2));
    //return;
    for (i=2; i<=n; ++i)
        for (j=-n+1; j<=n-1; ++j)
            for (k=s1; k<=s2; ++k)
            {
                d[i][nr(j)][sum(k)] += d[i-1][nr(j-1)][sum(k-j)] + d[i-1][nr(j+1)][sum(k-j)];
                //printf("%d %d %d - %d\n", i, j, k, d[i][nr(j)][sum(k)]);
            }
    for (i=-n+1; i<=n-1; ++i)
        sol += d[n][nr(i)][sum(s)];
    printf("%d",sol);
}

int main()
{
    freopen("1-sir.in","r",stdin);
    freopen("1-sir.out","w",stdout);
    citire();
    if ((n + 1)%4 == 0 && s % 2 == 0)
    {
        printf("0\n");
        return 0;
    }
    else if (((n+1)%2 == 0) && ((n+1)%4 != 0) && s % 2 == 1)
    {
        printf("0\n");
        return 0;
    }
    else if ((n%4 == 0) && s % 2 == 1)
    {
        printf("0\n");
        return 0;
    }
    else if ((n%2 == 0) && (n%4!=0) && s % 2 == 0)
    {
        printf("0\n");
        return 0;
    }
    solve();
    return 0;
}