一个非完全平方数应该乘上什么数才能是完全平方数?

这是我做 AtCoder 的时候发现的一个问题,有感而发:
首先,对于任何一个数,我们都能给它做质因数分解,也就是把他们分成一个个质因数的平方乘
现在考虑一个非完全平方数,就假如它分解质因数之后的形式为:

253457

那么我们把他的平方数进行模 \(2\) 操作之后就变成了:
213052=10
显然,原来的数乘上这个模之后的数一定为一个完全平方数,这里称之为基准数,因为没有比它更小的了,同样的还可去乘基准数的相关平方 \(+2\) 的数
那么就很好解决了
我们直接把这个数分解平方质因数,然后会得到一个基准数,那么对于其他的数来说,如果两数的基准数相同,那么相乘之后一定会是一个完全平方数:
参考代码:

#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 1e6 + 10, mod = 1e9 + 7;
signed main()
{
    std::ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
    int n; cin >> n;
    vector<int> a(N + 1);
    int res = 0;
    for (int i = 1; i <= n; i++)
    {
        int x;
        cin >> x;
        if (x == 0)
        {
            res += i - 1; a[0]++;
        }
        else
        {
            for (int j = 2; j * j <= x; j++)
            {
                int k = j * j;
                while (!(x % k)) x /= k;
            }
            res += a[0] + a[x];
            a[x]++;
        }
    }
    cout << res;
    return 0;
}
posted @ 2024-05-27 21:15  o-Sakurajimamai-o  阅读(29)  评论(0编辑  收藏  举报
-- --