Pagini recente » Cod sursa (job #799991) | Cod sursa (job #2610946) | Cod sursa (job #2525638) | Cod sursa (job #2086203) | Cod sursa (job #76158)
Cod sursa(job #76158)
#include <cstdio>
//#include <vector>
//using namespace std;
#define maxn 1024
#define maxp 304729
#define maxp2 309713
FILE *in = fopen("oite.in", "r"), *out = fopen("oite.out", "w");
struct hash
{
short i, nr;
int sum;
//hash *next;
};
int n;
int L;
int a[maxn];
hash h[maxp][5];
hash h2[maxp2][5];
int nrh[maxp], nrh2[maxp2];
void hadd(int p, int q)
{
int v = a[p] + a[q];
int t = v % maxp;
int d = v % maxp2;
if ( h[t] )
if ( h[t][nrh[t]-1].i == p && h[t][nrh[t]-1].sum == v )
{
++h[t][nrh[t]-1].nr;
return;
}
if ( h2[d] )
if ( h2[d][nrh2[d]-1].i == p && h2[d][nrh2[d]-1].sum == v )
{
++h2[d][nrh[d]-1].nr;
return;
}
if ( nrh[t] < nrh2[d] )
h[t][nrh[t]].i = p, h[t][nrh[t]].nr = 1, h[t][nrh[t]].sum = v, ++nrh[t];
else
h2[d][nrh2[d]].i = p, h2[d][nrh2[d]].nr = 1, h2[d][nrh2[d]].sum = v, ++nrh2[d];
}
int hget(int p, int q)
{
int v = (L - (a[p] + a[q]));
if ( v < 0 )
return 0;
int s = 0;
int t = v % maxp;
int d = v % maxp2;
for ( int i = 0; i != 5; ++i )
{
if ( h[t][i].i > q && h[t][i].sum == v )
s += h[t][i].nr;
if ( h2[d][i].i > q && h2[d][i].sum == v )
s += h2[d][i].nr;
}
return s;
}
int main()
{
fscanf(in, "%d %d", &n, &L);
for ( int i = 0; i < n; ++i )
fscanf(in, "%d", &a[i]);
for ( int i = 0; i < n; ++i )
for ( int j = i+1; j < n; ++j )
hadd(i, j);
int cnt = 0;
for ( int i = 0; i < n; ++i )
for ( int j = i+1; j < n; ++j )
cnt += hget(i, j);
fprintf(out, "%d\n", cnt);
return 0;
}