Cod sursa(job #32154)

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

#define MAXN 1024
#define MOD 150001

typedef long long llong;

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

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)
      {
        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;
}