Cod sursa(job #497642)

Utilizator Eugen01Vasilescu Eugen Eugen01 Data 2 noiembrie 2010 22:52:33
Problema Oite Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.34 kb
#include<stdio.h> 
#include<math.h>
#include<stdlib.h> 
 
 
struct point 
{ 
    
int inf,s1,s2,s3; 
    
point *leg; 
}; 
 
 
point *qq,*p,*s[677000]; 
int qqq,y,i,j,k,n; 
int 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)
{
	int *x=(int*)a1;
	int *y=(int*)b1;
	
	if (*x>*y) return 1;
		else return -1;
}
 
 
int main() 
{ 
	freopen("oite.in","r",stdin); 
	freopen("oite.out","w",stdout); 
	
	scanf("%d%d",&n,&sum); 
	
	for (i=1;i<=n;i++) 
			scanf("%d",&a[i]); 
	
	qsort(a,n,sizeof(int),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("%d",nr/3);  

return 0; 
}