好元素(good)
题意/Description:
小A一直认为,如果在一个由N个整数组成的数列An中,存在Am + An + Ap = Ai(1 <= m, n, p < i)(m, n, p可以相同)的话,Ai就是一个“好元素”。现在,小A有一个数列,他想知道这个数列中有多少个“好元素”,请你帮帮他。
读入/Input:
第一行只有一个正整数N,意义如上。
第二行包含N个整数,表示数列An。
输出/Output:
输出一个整数,表示这个数列中“好元素”的个数。
题解/solution:
读完题,发现Ap是可以与Am和An相同的,而且只能找Ai之前的。然后这题变的很容易了,只要判断Ai-Am的数是否存在,就OK了。这个数暴力出来,整个过程用hash表储存,就是一个水啊。
注意hash表的范围。
代码/Code:
const
mood=14150547;
var
n,ans,k:longint;
f:boolean;
sum:array[-mood..mood] of longint;
a:array[0..5001] of longint;
function hash(i:longint):longint;
var
j:longint;
begin
j:=i mod mood;
while (sum[j]<>0) and (sum[j]<>i) do
j:=(j+1) mod mood;
exit(j);
end;
procedure init;
var
i,j,t:longint;
begin
readln(n);
for i:=1 to n do
begin
read(a[i]);
for j:=1 to i-1 do
begin
t:=a[i]-a[j];
if t=0 then
begin
if f then
begin
inc(ans);
break;
end;
end else
if sum[hash(t)]=t then
begin
inc(ans);
break;
end;
end;
if a[i]=0 then f:=true;
for j:=1 to i do
sum[hash(a[i]+a[j])]:=a[i]+a[j];
end;
end;
begin
init;
write(ans);
end.