Pagini recente » Cod sursa (job #1108323) | Cod sursa (job #3004859) | Cod sursa (job #2873412) | Cod sursa (job #2518491) | Cod sursa (job #2846270)
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("oite.in");
ofstream fout("oite.out");
const int MAX=1100;
const int P=997;
int n,l,cnt,v[MAX],tmp[MAX];
struct nod
{
int info,cnt;
nod *urm;
}*H[P];
void mergesort(int st, int dr)
{
if(st==dr)
return;
int m=(st+dr)/2;
mergesort(st,m);
mergesort(m+1,dr);
int k=0;
int i=st;
int j=m+1;
while(i<=m && j<=dr)
if(v[i]<v[j])
tmp[++k]=v[i++];
else
tmp[++k]=v[j++];
while(i<=m)
tmp[++k]=v[i++];
while(j<=dr)
tmp[++k]=v[j++];
for(i=st,j=1;i<=dr;i++,j++)
v[i]=tmp[j];
}
int aparitii(int x)
{
int xmod=x%P;
for(nod *p=H[xmod];p;p=p->urm)
if(p->info==x)
return p->cnt;
return 0;
}
void adauga(int x)
{
int xmod=x%P;
if(!aparitii(x))
{
nod *u=new nod;
u->info=x;
u->cnt=1;
u->urm=H[xmod];
H[xmod]=u;
return;
}
for(nod *p=H[xmod];p;p=p->urm)
if(p->info==x)
{
p->cnt++;
return;
}
}
int main()
{
fin >> n >> l;
for(int i=1;i<=n;i++)
fin >> v[i];
mergesort(1,n);
for(int i=1;i<=n;i++)
{
for(int j=i+1;j<=n;j++)
{
int s=v[i]+v[j];
cnt+=aparitii(l-s);
}
for(int j=1;j<i;j++)
adauga(v[i]+v[j]);
}
fout << cnt;
return 0;
}