Pagini recente » Cod sursa (job #445741) | Cod sursa (job #108230) | Cod sursa (job #2364146) | Cod sursa (job #2077014) | Cod sursa (job #1765729)
#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[MOD+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;
}