题目描述
小A一直认为,如果在一个由N个整数组成的数列An中,存在Am + An + Ap = Ai(1 <= m, n, p < i)(m, n, p可以相同)的话,Ai就是一个“好元素”。现在,小A有一个数列,他想知道这个数列中有多少个“好元素”,请你帮帮他。
输入
第一行只有一个正整数N,意义如上。
第二行包含N个整数,表示数列An。
输出
输出一个整数,表示这个数列中“好元素”的个数。
样例输入
2
1 3
6
1 2 3 5 7 10
3
-1 2 0
样例输出
1
4
1
提示
【数据范围】
对于10%的数据 1<=N<=10
对于40%的数据 1<=N<=500 -10^5<=Ai<=10^5
对于70%的数据 1<=N<=5000 -10^6<=Ai<=10^6
对于100%的数据 1<=N<=5000 -10^9<=Ai<=10^9
我们把等式变形,Am+An=Ai-Ap,于是我们便得到了n^2的方法。我们用哈希记录每一个Am+An,对于一个数Ai,我们枚举p,找到Am+An=Ai-Ap,ans就+1。然后从1到i枚举,加入Ai+Aj。
const mo=14150547;
var
head:array[-mo..mo] of longint;
ans,i,j,num,tot,n,pre:longint;
s,x,tmp1,tmp2:longint;
a:array[0..5005] of longint;
procedure find(tmp,x:longint);
var
i:longint;
begin
while (head[tmp]<>2000000009) do
begin
if head[tmp]=x then begin ans:=ans+1; exit; end;
tmp:=(tmp+1) mod mo;
end;
end;
procedure ins(tmp,x:longint);
var
i:longint;
begin
while (head[tmp]<>x)and(head[tmp]<>2000000009) do
begin
tmp:=(tmp+1) mod mo;
end;
head[tmp]:=x;
end;
begin
readln(n);
for i:=-mo to mo do head[i]:=2000000009;
for i:=1 to n do
begin
read(a[i]);
pre:=ans;
for j:=1 to i-1 do
begin
s:=a[i]-a[j];
tmp1:=s mod mo;
find(tmp1,s);
if ans<>pre then break;
end;
for j:=1 to i do
begin
s:=a[i]+a[j];
tmp1:=s mod mo;
ins(tmp1,s);
end;
end;
write(ans);
end.