这是我做 AtCoder 的时候发现的一个问题,有感而发:
首先,对于任何一个数,我们都能给它做质因数分解,也就是把他们分成一个个质因数的平方乘
现在考虑一个非完全平方数,就假如它分解质因数之后的形式为:
那么我们把他的平方数进行模 \(2\) 操作之后就变成了:
显然,原来的数乘上这个模之后的数一定为一个完全平方数,这里称之为基准数,因为没有比它更小的了,同样的还可去乘基准数的相关平方 \(+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;
}
标签:平方,int,res,基准,完全,才能,质因数
From: https://www.cnblogs.com/o-Sakurajimamai-o/p/18216546