Cod sursa(job #1762590)

Utilizator BarbumateiBarbu Matei Barbumatei Data 23 septembrie 2016 20:17:02
Problema Oite Scor 80
Compilator c Status done
Runda Arhiva de probleme Marime 1.25 kb
#include <stdio.h>
#include <stdlib.h>
#define MOD 3076529
#define h(x) (x%MOD)
#define MAXC 1024
#define MAXN (MAXC*(MAXC+1))/2
long long rasp;
int v[MAXC+1], val[MAXN+1], next[MAXN+1], lista[MAXN+1], f[MAXN+1], n, x, poz, hash;

inline void apar(){
  poz=lista[hash];
  while(poz && val[poz]!=x)
    poz=next[poz];
}

inline void insert(){
  apar();
  if(poz){
    f[poz]++;
    return;
  }
  val[++n]=x;
  f[n]=1;
  next[n]=lista[hash];
  lista[hash]=n;
}

int main(){
  int c, l, i, j;
  FILE *fin, *fout;
  fin=fopen("oite.in", "r");
  fout=fopen("oite.out", "w");
  fscanf(fin, "%d%d", &c, &l);
  for(i=1; i<=c; i++)///citim
    fscanf(fin, "%d", &v[i]);
  x=v[c]+v[c-1]; hash=h(x);
  insert();///inseram suma ultimelor 2 elem
  for(j=c-2; j>1; j--){///apoi lam elemente 2 cate 2
    for(i=1; i<j; i++)
      if(l>=v[i]+v[j]){///si verificam daca scazand din l suma lor a mai aparut in hash,
        x=l-v[i]-v[j]; hash=h(x);
        apar();
        rasp += f[poz];///adica daca au fost inserate in hash alte 2 nr care impreuna cu astea 2 dau l
      }
    for(i=j+1; i<=c; i++){
      x=v[i]+v[j]; hash=h(x);
      insert();
    }
  }
  fprintf(fout, "%lld\n", rasp);
  fclose(fin);
  fclose(fout);
    return 0;
}