题目
http://oj.daimayuan.top/course/10/problem/607
分析
a^2+b=c^2
b =(c+a)(c-a)
=(x+2a)(x)
对每个数b,枚举约束 x,检查是否存在对应的a即可。
一百万以内的数,最大约数个数是240。
代码
// http://oj.daimayuan.top/course/10/problem/607
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1000005;
int n;
int a[MAXN];
int cnt[MAXN];
int used[MAXN];
void solve()
{
long long ans=0;
scanf("%d",&n);
for (int i=1; i<=n; i++) {
scanf("%d",&a[i]);
cnt[a[i]]++;
}
for (int i=1; i<=n; i++) if (!used[a[i]]) {
used[a[i]]=1;
int B=a[i];
int k=1, t=a[i], x1, x2;
while (k<t) { // 枚举约数
if (t%k==0) {
x1=k;
x2=B/k;
if ((x2-x1)%2==0) ans += cnt[(x2-x1)/2];
}
k=t/(t/(k+1));
}
if (k==t) ans+= cnt[0];
}
printf("%lld\n",ans);
}
int main()
{
solve();
return 0;
}
/*
int k=1, t=a[i], x1, x2;
while (k<t) {
if (t%k==0) {
x1=k;
x2=B/k;
if (x2<x1) break;
if ((x2-x1)&1) continue;
ans += cnt[(x2-x1)/2];
}
k=t/(t/(k+1));
}
for (int i=1; i<=n; i++) if (!used[a[i]]) {
used[a[i]]=1;
int B=a[i];
int L=1, R=B, x1, x2;
while (L<R) {
if (B%L == 0) {
x1=L;
x2=B/L;
if (x2<x1) break;
if ((x2-x1)%2==0) ans += cnt[(x2-x1)/2];
}
R=B/(L+1);
L=B/R;
}
if (L==R && n%L==0) ans+=cnt[0];
}
*/