题干:
给出长度为n的序列a, 求有多少对数对 (i, j) (1 <= i < j <= n) 满足 ai + aj 为完全平方数。
输入描述:
第一行一个整数 n (1 <= n <= 105)
第二行 n 个整数 ai (1 <= ai <= 105)
输出描述:
输出一个整数,表示满足上述条件的数对个数。
示例1
输入
3
1 3 6
输出
2
说明
满足条件的有 (1, 2), (2, 3) 两对。
解题报告:
这题不算难,但是我想知道为啥带个log就wa?
AC代码:
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<queue>
#include<map>
#include<vector>
#include<set>
#include<string>
#include<cmath>
#include<cstring>
#define ll long long
#define pb push_back
#define pm make_pair
#define fi first
#define se second
using namespace std;
const int MAX = 3e5 + 5;
int box[MAX];
int main()
{
int n;
scanf("%d",&n);
ll ans=0;
for(int i=1; i<=n; i++) {
int t;
scanf("%d",&t);
for(int j=2; j<=500; j++) {
if(j*j>t) ans+=box[j*j-t];
}
box[t]++;
}
printf("%lld",ans);
return 0;
}
WA代码:(还是说这种做法就不对?)
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<queue>
#include<map>
#include<vector>
#include<set>
#include<string>
#include<cmath>
#include<cstring>
#define ll long long
#define pb push_back
#define pm make_pair
#define fi first
#define se second
using namespace std;
int n,tot;
ll biao[505000];
ll a[100005];
int main()
{
cin>>n;
for(ll i = 1; i*i<=(ll)7e5; i++) {
biao[++tot] = i*i;
// printf("%d\n",biao[i]);
}
for(int i = 1; i<=n; i++) {
scanf("%lld",a+i);
}
sort(a+1,a+n+1);
ll ans = 0;
for(int i = 1; i<=n; i++) {
for(int j = 1; j<=tot; j++) {
if(biao[j]-a[i] < a[1] || biao[j]-a[i] > a[n]) continue;
if(binary_search(a+1,a+n+1,biao[j]-a[i])) {
ans += upper_bound(a+1,a+n+1,biao[j]-a[i]) - lower_bound(a+1,a+n+1,biao[j]-a[i]);
}
}
}
printf("%lld\n",ans/2);
return 0 ;
}