Cod sursa(job #32234)

Utilizator astronomyAirinei Adrian astronomy Data 17 martie 2007 15:48:13
Problema Oite Scor 100
Compilator c Status done
Runda Arhiva de probleme Marime 1.55 kb
#include <stdio.h>

#define MAXN 1024
#define MOD_1 10007
#define MOD_2 12007

typedef long long llong;

int N, L, A[MAXN];

int H_1[MOD_1][8], H_2[MOD_2][8];
int Nr_1[MOD_1][8], Nr_2[MOD_2][8];

llong res;

void insert(int val)
{
    int i, k, k1, k2;

    for(i = H_1[k=k1=val%MOD_1][0]; i >= 0; i--)
     if(H_1[k][i] == val) { Nr_1[k][i]++; return; }
    for(i = H_2[k=k2=val%MOD_2][0]; i >= 0; i--)
     if(H_2[k][i] == val) { Nr_2[k][i]++; return; }

    if(H_1[k1][0] < H_2[k2][0])
        H_1[k1][++H_1[k1][0]] = val, Nr_1[k1][H_1[k1][0]] = 1;
    else
        H_2[k2][++H_2[k2][0]] = val, Nr_2[k2][H_2[k2][0]] = 1;
}

int query(int val)
{
    int i, k;

    for(i = H_1[k=val%MOD_1][0]; i >= 0; i--)
     if(H_1[k][i] == val) return Nr_1[k][i];
    for(i = H_2[k=val%MOD_2][0]; i >= 0; i--)
     if(H_2[k][i] == val) return Nr_2[k][i];

    return 0;
}

void solve(void)
{
    int i, j;

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

void read_data(void)
{
    int i;

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

    for(i = 0; i < N; 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);

    read_data();
    solve();
    write_data();

    return 0;
}