XXII Open Cup named after E.V. Pankratiev, Grand Prix of IMO M. Math
题目大意:
给你一个序列,求有多少个 i , j i,j i,j满足 a i 2 + a j a_{i}^2+a_{j} ai2+aj是平方数 ( 1 ≤ i , j ≤ n ) (1\leq i,j \leq n) (1≤i,j≤n)
基本思路:
求出 c n t cnt cnt数组,暴力枚举平方数
#include <bits/stdc++.h>
using namespace std;
#define Paddi ios::sync_with_stdio(0), cin.tie(0)
#define int long long int
const int N = 1e6 + 10;
int t[N];
void get()
{
int now = 1;
for (int i = 1; i < N; i++)
{
if (now * now == i)
now++;
t[i] = now;
}
}
signed main()
{
// get();
int n;
cin >> n;
vector<int> cnt(N, 0);
for (int i = 1; i <= n; i++)
{
int x;
cin >> x;
cnt[x]++;
}
int ans = 0;
for (int i = 1; i <= 1e6; i++)
{
if (cnt[i] == 0)
continue;
for (int j = i; j * j - i * i <= 1e6; j++)
ans += (cnt[i] * cnt[(j * j) - (i * i)]);
}
cout << ans << endl;
return 0;
}