Pagini recente » Cod sursa (job #3187614) | Cod sursa (job #620640) | Cod sursa (job #431151) | Cod sursa (job #2008027) | Cod sursa (job #32150)
Cod sursa(job #32150)
#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;
}