Pagini recente » Cod sursa (job #454010) | Cod sursa (job #24418) | Cod sursa (job #1760971) | Cod sursa (job #933759) | Cod sursa (job #32154)
Cod sursa(job #32154)
#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;
}