Pagini recente » template/preoni-2006 | Cod sursa (job #2683887) | Istoria paginii runda/lsort | Cod sursa (job #759750) | Cod sursa (job #793049)
Cod sursa(job #793049)
#include <fstream>
#include <vector>
#define MOD 666013
#define NM 1030
#define val first
#define count second
using namespace std;
ifstream f("oite.in");
ofstream g("oite.out");
vector< pair<int, int> > H1[MOD];
vector< pair<int, int> > H2[MOD];
vector< pair<int, int> >::iterator it;
int V[NM];
int N,i,j,L;
int X;
void InsertH1 (int X)
{
int L=X%MOD;
for (it=H1[L].begin(); it!=H1[L].end(); ++it)
if (it->val==X)
{
++it->count;
return;
}
H1[L].push_back(make_pair(X,1));
}
void InsertH2 (int X)
{
int L=X%MOD;
for (it=H2[L].begin(); it!=H2[L].end(); ++it)
if (it->val==X)
{
++it->count;
return;
}
H2[L].push_back(make_pair(X,1));
}
int FindH2 (int X)
{
int L=X%MOD;
for (it=H2[L].begin(); it!=H2[L].end(); ++it)
if (it->val==X)
return it->count;
return 0;
}
int FindH1 (int V, int X)
{
int ANS=0;
if (V==X-V) ANS--;
X-=V;
int L=X%MOD;
for (it=H1[L].begin(); it!=H1[L].end(); ++it)
if (it->val==X)
{
ANS+=it->count;
break;
}
return ANS;
}
int main ()
{
f >> N >> L;
for (i=1; i<=N; i++)
{
f >> V[i];
InsertH1(V[i]);
}
for (i=1; i<=N; i++)
for (j=i+1; j<=N; j++)
InsertH2(V[i]+V[j]);
int ANS=0;
for (i=1; i<=N; i++)
for (j=i+1; j<=N; j++)
if (V[i]+V[j]<=L)
{
X=L-(V[i]+V[j]);
ANS+=FindH2(X);
if (X>=V[i]) ANS-=FindH1(V[i],X);
if (X>=V[j]) ANS-=FindH1(V[j],X);
if (V[i]+V[j]==X) ANS++;
}
g << ANS/6 << '\n';
f.close();
g.close();
return 0;
}