Cod sursa(job #93921)

Utilizator gigi_becaliGigi Becali gigi_becali Data 20 octombrie 2007 20:09:53
Problema Oite Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.97 kb
using namespace std;
#include <cstdio>
#include <algorithm>
#define maxn 128123
#define maxlog 17

int a[1024], n, S;

struct nod { short i, j; int nr;nod(){}; nod(short a, short b,int c){i=a; j=b;nr=c;};};

nod H[maxn][maxlog];

inline int insert(short i, short j)
{
  int s=a[i]+a[j];
  int h1=s%maxn;
  int h2=s%maxlog;
  if(H[h1][h2].nr==0)
    H[h1][h2]=nod(i, j,1);
  else ++H[h1][h2].nr;
}
unsigned int nr=0;

inline void find(short i, short j)
{
  int s=S-a[i]-a[j];
  if(s<0) return;
  int h1=s%maxn;
  int h2=s%maxlog;
  
  short k, t;
  k=H[h1][h2].i, t=H[h1][h2].j;
  if(k==0 && t==0) return;
  if(k==i || k==j || t==i || t==j) return;
  nr+=H[h1][h2].nr;
}

int main()
{
  freopen("oite.in","r",stdin);
  scanf("%d %d\n", &n, &S);
  int i, j;
  for(i=1;i<=n;++i) scanf("%d ", a+i);

  for(i=1;i<n;++i)
    for(j=i+1;j<=n;++j)
      insert(i, j);

  for(i=1;i<n;++i)
    for(j=i+1;j<=n;++j)
      find(i, j);

  freopen("oite.out","w",stdout);
  printf("%d\n", nr/6);
  return 0;
}