枚举平方数(小技巧)
链接:https://ac.nowcoder.com/acm/contest/215/A
来源:牛客网
给出长度为n的序列a, 求有多少对数对 (i, j) (1 <= i < j <= n) 满足 ai + aj 为完全平方数。
输入描述:
第一行一个整数 n (1 <= n <= 10
5
)
第二行 n 个整数 a
i
(1 <= a
i
<= 10
5
)
输出描述:
输出一个整数,表示满足上述条件的数对个数。
示例1
说明
满足条件的有 (1, 2), (2, 3) 两对。
有几个需要注意的点就是,就是1<=i<j<=n
就是一看到这个条件不一定要枚举i,可以枚举j,就像这个题是的,枚举i是做不出来的(因为a[p]-j可能有多个,下标不好知道)
,一定要枚举j,这样加入一个i,就vis[x]++,加的时候就是ans+=vis[a[j]-x],这样就可以了
#include<iostream> #include<algorithm> using namespace std; const int maxn=1e6+100; typedef long long ll; int a[maxn]; int vis[maxn]; int cnt=0; void inint(){ for(int i=1;;i++){ a[++cnt]=i*i; if(i*i>2e5+100){ break; } } } int main(){ inint(); int n; cin>>n; ll ans=0; int x; for(int i=1;i<=n;i++){ cin>>x; for(int j=1;j<=cnt;j++){ if(a[j]<x){ continue; } ans+=vis[a[j]-x]; } vis[x]++; } cout<<ans<<endl; }