目录:
题目:
分析:
10%
随便做。
40%
用布尔数组保存存在的元素,用三层枚举
,
,
,如果
存在,那么答案加1。注意枚举顺序和判重。
70%
预处理两个数的和,再枚举,因为每一个元素值比较小,开一个数组来存储是否存在。(其实
的方法加上剪枝也可以过)
100%
因为元素的值比较大,在70%的思想上用哈希进行判断即可。
代码:
#pragma GCC optimize("3")
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
#include<map>
#define mod 25000003
#define LL long long
using namespace std;
inline LL read() {
LL d=0,f=1;char s=getchar();
while(s<'0'||s>'9'){if(s=='-')f=-1;s=getchar();}
while(s>='0'&&s<='9'){d=d*10+s-'0';s=getchar();}
return d*f;
}
int p[25000004];
int x[5001],ans;
int locate(int x)
{
int wz=(x%mod+mod)%mod;
while(p[wz]!=99999999&&p[wz]!=x) wz++,wz%=mod;
return wz;
}
void in(int x)
{
p[locate(x)]=x;
return;
}
int main()
{
// freopen("good.in","r",stdin);
// freopen("good.out","w",stdout);
int n=read();
for(int i=0;i<=25000003;i++) p[i]=99999999;
for(int i=1;i<=n;i++)
{
x[i]=read();
for(int j=1;j<i;j++)
if(p[locate(x[i]-x[j])]==x[i]-x[j]) {ans++;break;}
for(int j=1;j<=i;j++)
if(p[locate(x[j]+x[i])]!=x[j]+x[i]) in(x[j]+x[i]);
}
printf("%d",ans);
fclose(stdin);
fclose(stdout);
return 0;
}