Pagini recente » Cod sursa (job #180713) | Cod sursa (job #1152199) | Cod sursa (job #749327) | Cod sursa (job #20551) | Cod sursa (job #674400)
Cod sursa(job #674400)
#include <cstdio>
#include <cassert>
#include <vector>
#define Nmax 1030
#define Mod 299993
#define InFile "oite.in"
#define OutFile "oite.out"
#define pb push_back
using namespace std;
int n, L;
int T[Nmax];
struct Tip {int S, x, y;};
vector <Tip> H[Mod];
void read();
void precalc();
int search (int Sum);
void insert (Tip El);
void solve();
int main()
{
assert (freopen (InFile, "r", stdin));
assert (freopen (OutFile, "w", stdout));
read();
precalc();
solve();
return 0;
}
void read()
{
int i;
scanf ("%d %d\n", &n, &L);
for (i=1; i<=n; i++)
scanf ("%d ", &T[i]);
}
void precalc()
{
int i, j;
Tip el;
for (i=1; i<n; i++)
for (j=i+1; j<=n; j++)
{
el.S=T[i]+T[j]; el.x=i; el.y=j;
insert (el);
}
}
int search (int Sum)
{
int i, ch=Sum%Mod, lg=H[ch].size();
for (i=0; i<lg; i++)
if (H[ch][i].S==Sum)
return i;
return -1;
}
void insert (Tip El)
{
int ch=El.S%Mod;
H[ch].pb (El);
}
void solve()
{
int i, j, k, nrsol=0, ch, pz, lg, S;
for (i=1; i<n; i++)
for (j=i+1; j<=n; j++)
{
S=L-T[i]-T[j];
pz=search (S);
if (pz!=-1)
{
ch=S%Mod;
lg=H[ch].size();
for (k=0; k<lg; k++)
if (j<H[ch][k].x)
nrsol++;
}
}
printf ("%d\n", nrsol);
}