好元素(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.


  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值