Pagini recente » Profil VKaterina11 | Cod sursa (job #32276) | Cod sursa (job #1930249) | Cod sursa (job #1749399) | Cod sursa (job #32228)
Cod sursa(job #32228)
#include <stdio.h>
#define MAXN 1024
#define MOD_1 100001
#define MOD_2 90003
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;
}