Pagini recente » Banuti | Mihnea Andreescu | Algoritmiada 2010 - Clasament general, Clasele 9-10 | Statistici cont de teste (adyshor) | Cod sursa (job #497631)
Cod sursa(job #497631)
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
struct point
{
long long inf,s1,s2,s3;
point *leg;
};
point *qq,*p,*s[677000];
int qqq,y,i,j,k,n;
long long suma,sum,nr,a[1024];
void verif(long long q,long long y)
{
qq=s[q%(y+1)];
while (qq!=NULL)
{
if (qq->inf==q);
if (qq->s1!=s[i]->s1&&qq->s1!=s[i]->s2&&qq->s2!=s[i]->s1&&qq->s2!=s[i]->s2&&qq->s1!=qq->s2&&s[i]->s1!=s[i]->s2)
nr++;
qq=qq->leg;
}
}
void hash(long long x,long long y)
{
p=new point;
p->inf=x;
p->s1=i;
p->s2=j;
p->leg=s[x%(y+1)];
s[x%(y+1)]=p;
}
int comp(const void *a1,const void *b1)
{
long long *x=(long long*)a1;
long long *y=(long long*)b1;
if (*x>*y) return 1;
else return -1;
}
int main()
{
freopen("oite.in","r",stdin);
freopen("oite.out","w",stdout);
scanf("%d%lld",&n,&sum);
for (i=1;i<=n;i++)
scanf("%lld",&a[i]);
qsort(a,n,sizeof(long long),comp);
for (i=1;i<=n-1;i++)
for (j=i+1;j<=n;j++)
if (a[i]+a[j]<sum) hash(a[i]+a[j],((a[i]+a[j])%676513));
for (i=0;i<=676514;i++)
while (s[i]!=NULL)
{
if (sum-s[i]->inf>0) verif(sum-s[i]->inf,(sum-s[i]->inf)%676513);
s[i]=s[i]->leg;
}
printf("%lld",nr/3);
return 0;
}