Pagini recente » Cod sursa (job #2338187) | Cod sursa (job #968516) | Cod sursa (job #911634) | Cod sursa (job #39427)
Cod sursa(job #39427)
#include <stdio.h>
#define infile "oite.in"
#define outfile "oite.out"
#define CMAX 1025
#define HASH_MIC 509
#define HASH_MARE 262153
struct NOD_HASH{int val,count; NOD_HASH *adr;};
FILE *fin,*fout;
int C,L;
int x[CMAX];
NOD_HASH *hash[HASH_MIC],*HASH[HASH_MARE];
int SOL=0;
void citire()
{
fin=fopen(infile,"r");
fscanf(fin,"%d %d",&C,&L);
for(int i=0;i<C;i++)
fscanf(fin,"%d",&x[i]);
fclose(fin);
}
inline int h1(int x)
{
int aux=x%HASH_MIC;
if(aux>=0)
return aux;
return aux+HASH_MIC;
}
inline int h2(int x)
{
int aux=x%HASH_MARE;
if(aux>=0)
return aux;
return aux+HASH_MARE;
}
void insert_hash(NOD_HASH *(&prim), int x)
{
NOD_HASH *b=prim;
while(b)
{
if(b->val==x)
{
b->count++;
return;
}
b=b->adr;
}
b=new NOD_HASH;
b->val=x;
b->count=1;
b->adr=prim;
prim=b;
}
int search_hash(NOD_HASH *prim, int x)
{
NOD_HASH *b=prim;
while(b)
{
if(b->val==x)
return b->count;
b=b->adr;
}
return 0;
}
void init()
{
int i,j;
for(i=0;i<HASH_MIC;i++)
hash[i]=NULL;
for(i=0;i<HASH_MARE;i++)
HASH[i]=NULL;
for(i=0;i<C;i++)
insert_hash(hash[h1(x[i])],x[i]);
for(i=0;i<C;i++)
for(j=i+1;j<C;j++)
insert_hash(HASH[h2(x[i]+x[j])],x[i]+x[j]);
}
void solve()
{
int i,j,aux,S;
for(i=0;i<C;i++)
for(j=i+1;j<C;j++)
{
S=L-x[i]-x[j];
aux=search_hash(HASH[h2(S)],S);
SOL+=aux;
if(aux)
{
SOL-=search_hash(hash[h1(S-x[i])],S-x[i]);
if(S-x[i]==x[i])
SOL++;
SOL-=search_hash(hash[h1(S-x[j])],S-x[j]);
if(S-x[j]==x[j])
SOL++;
if(S==x[i]+x[j])
SOL++;
}
}
}
int main()
{
citire();
init();
solve();
fout=fopen(outfile,"w");
fprintf(fout,"%d\n",SOL/6);
fclose(fout);
return 0;
}