Wannafly挑战赛27
A.灰魔法师
题目描述
“White shores, and beyond. A far green country under a swift sunrise.”--灰魔法师
给出长度为n的序列a, 求有多少对数对 (i, j) (1 <= i < j <= n) 满足 ai + aj 为完全平方数。
给出长度为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) 两对。
解题思路:预处理,边读边遍历累加数对即可,注意cnt要开long long。
AC代码:
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int maxn=200005; 4 typedef long long LL; 5 int n,x,a[maxn],b[448];LL cnt;//数对数cnt要开long long 6 int main(){ 7 for(int i=0;i<448;++i)b[i]=i*i;//预处理2e5内的所有完全平方数 8 while(cin>>n){ 9 cnt=0;memset(a,0,sizeof(a)); 10 while(n--){ 11 cin>>x;//读入一个数之前,相当于往前遍历累加能与当前x之和构成完全平方数的数b[j]-x的个数 12 for(int j=upper_bound(b,b+448,x)-b;j<448;++j)cnt+=a[b[j]-x]; 13 a[x]++; 14 } 15 cout<<cnt<<endl; 16 } 17 return 0; 18 }