枚举平方数(小技巧)

链接: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

输入

复制
3
1 3 6

输出

复制
2

说明

满足条件的有 (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;
} 
 
原文地址:https://www.cnblogs.com/lipu123/p/14262119.html