Pagini recente » Cod sursa (job #1922775) | Cod sursa (job #68746) | Cod sursa (job #1663324) | Cod sursa (job #1415849) | Cod sursa (job #1369030)
#include <stdio.h>
#define MOD 1050051
#define MAXN 1024
#define MAXM (MAXN*(MAXN+1)/2)
int v[MAXN+1], val[MAXM+1], next[MAXM+1], fr[MAXM+1], lista[MOD], m;
inline int oite(int x){
int p=lista[x%MOD], sol=0;
while((p!=0)&&(sol==0)){
if(val[p]==x){
sol=fr[p];
}
p=next[p];
}
return sol;
}
inline void adauga(int x){
int p=lista[x%MOD], f=0;
while((p!=0)&&(f==0)){
if(val[p]==x){
f=p;
}
p=next[p];
}
if(f==0){
m++;
val[m]=x;
fr[m]=1;
next[m]=lista[x%MOD];
lista[x%MOD]=m;
}else{
fr[f]++;
}
}
int main(){
int n, k, i, j;
long long ans;
FILE *fin, *fout;
fin=fopen("oite.in", "r");
fout=fopen("oite.out", "w");
fscanf(fin, "%d%d", &n, &k);
for(i=1; i<=n; i++){
fscanf(fin, "%d", &v[i]);
}
ans=0;
adauga(v[n]+v[n-1]);
for(i=n-2; i>1; i--){
for(j=1; j<i; j++){
if(k>=v[i]+v[j]){
ans+=oite(k-v[i]-v[j]);
}
}
for(j=i+1; j<=n; j++){
adauga(v[i]+v[j]);
}
}
fprintf(fout, "%lld\n", ans);
fclose(fin);
fclose(fout);
return 0;
}