链接:https://www.nowcoder.com/acm/contest/215/A
来源:牛客网

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld

题目描述

“White shores, and beyond. A far green country under a swift sunrise.”--灰魔法师

给出长度为n的序列a, 求有多少对数对 (i, j) (1 <= i < j <= n) 满足 ai + aj 为完全平方数。

输入描述

第一行一个整数 n (1 <= n <= 10^5)
第二行 n 个整数 ai (1 <= ai <= 10^5)

输出描述

输出一个整数,表示满足上述条件的数对个数。

输入

3
1 3 6

输出

2

说明

满足条件的有 (1, 2), (2, 3) 两对。

解题思路

直接暴力就可以了。

#include <stdio.h>
#define N 250050
int a[N];
int main()
{
    int m, n;
    long long sum = 0;
    scanf("%d", &n);
    for (int i = 0; i < n; i++)
    {
        scanf("%d", &m);
        for (int j = 1; j < 500; j++)//遍历1~250000之间的完全平方数
            if (j * j >= m)
                sum += a[j * j - m];//首先满足j * j - m >= 0,然后用j * j - m与前面的m配对
        a[m]++;//m的个数加1,放在后面就是保证j * j - m与前面的m配对,不包括它本身
    }
    printf("%lld\n", sum);
    return 0;
}