Cod sursa(job #32150)

Utilizator astronomyAirinei Adrian astronomy Data 17 martie 2007 13:05:08
Problema Oite Scor 70
Compilator c Status done
Runda Arhiva de probleme Marime 1.82 kb
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define MAXN 1024
#define MOD 5003

typedef long long llong;

int N, C, L, A[MAXN], deg[MOD];
int *H[MOD], *Nr[MOD];

llong res;

void insert(int val)
{
    int *p, *n, key = val%MOD;

    for(p = H[key], n = Nr[key]; *p; n++, p++)
     if( (*p) == val ) { (*n)++; break ; }
}

int query(int val)
{
    int *p, *n, key = val%MOD;

    for(p = H[key], n = Nr[key]; *p; p++, n++)
     if( (*p) == val )
        return *n;

    return 0;
}

void solve(void)
{
    int i, j, k;

    for(i = 0; i < N; i++)
     for(j = i+1; j < N; j++)
      if(A[i]+A[j] <= L)
        deg[(A[i]+A[j])%MOD]++;

    for(i = 0; i < MOD; i++)
    {
        H[i] = (int*) malloc(sizeof(int)*(deg[i]+2)), H[i][deg[i]] = 0;
        Nr[i] = (int*) malloc(sizeof(int)*(deg[i]+2)), deg[i] = 0;
    }

    for(i = 0; i < N; i++)
     for(j = i+1; j < N; j++)
      if(A[i]+A[j] <= L)
      {
        k = (A[i]+A[j]) % MOD;
        H[k][deg[k]] = A[i]+A[j], Nr[k][deg[k]++] = 0;
      }

    for(i = N-1; i >= 0; i--)
    {
        for(j = i-1; j >= 0; j--)
         if( (k = L-A[i]-A[j]) >= 0 )
            res += (llong)query(k);
        for(j = i+1; j < N; j++)
         if( (k = A[i]+A[j]) <= L )
            insert(k);
    }
}

void read_data(void)
{
    int i, j;

    scanf("%d %d\n", &C, &L), N = C;

    for(i = 0; i < C; i++)
        scanf("%d ", &A[i]);
}

void write_data(void)
{
    printf("%lld\n", res);
}

int main(void)
{
    freopen("oite.in", "rt", stdin);
    freopen("oite.out", "wt", stdout);

    int start, end;

    start = clock();
    
    read_data();
    solve();
    write_data();

    end = clock();

    fprintf(stderr, "%lf\n", (double)(end-start)/CLK_TCK);
    
    return 0;
}