什么是完全平方数?
一个正整数如果可以表示为某个整数的平方,则称这个正整数为完全平方数。换句话说,如果存在整数 n,使得 m = n2,那么 m 就是一个完全平方数。例如 1、4、9、16、25 等都是完全平方数,因为它们分别是 12,22,32,42,52的结果。
性质
根据算术基本定理(也称为唯一分解定理),任意正整数 n 可以写成:
\(n = \prod_{i=1}^{k} p_i^{e_i}\) 或 \(n = p_1^{e_1} \cdot p_2^{e_2} \cdot \dots \cdot p_k^{e_k}\)
其中 p1,p2,……,pk 是互不相同的质数,e1,e2,……,ek 是非负整数,利用算术基本定理,我们可以对完全平方数进行更深入的分析和解释。
完全平方数的质因数分解特性
根据算术基本定理,假设 m = n2, n 的质因数分解为:
\(n = p_1^{a_1} \cdot p_2^{a_2} \cdot \cdots \cdot p_k^{a_k}\)
那么 m 的质因数分解就是:
\(n^2 = (p_1^{a_1})^2 \cdot (p_2^{a_2})^2 \cdot \cdots \cdot (p_k^{a_k})^2 = p_1^{2a_1} \cdot p_2^{2a_2} \cdot \cdots \cdot p_k^{2a_k}\)
从中可以看出,完全平方数的所有质因数的指数都是偶数。这是因为 m 中每个质因数的指数是 n 中对应指数的两倍。
那我们知道上面那些可以干嘛呢?
(标题是完全平方数,我们是不是可以用来判断一个数是不是完全平方数)
没错,我们可以用来判断一个数是不是完全平方数
假设我们有一个自然数m,那我们判断m是不是完全平方数的步骤为:
1. 质因数分解:将 m 分解为质因数的幂次形式:
\(m = p_1^{e_1} \cdot p_2^{e_2} \cdot \cdots \cdot p_k^{e_k}\)
2. 检查指数:检查所有质因数的指数 e1,e2,……,ek 是否均为偶数。
如果所有指数均为偶数,则 m 是完全平方数。
如果有任何一个指数是奇数,则 m 不是完全平方数。
题目
在这个题目中,我们已知一个 n 我们要找到最小的 x ,使得 n * x 为一个可得到且最小的完全平方数
思路
假设 n * x 分解质因数的结果为:
\(n * x = p_1^{a_1} \cdot p_2^{a_2} \cdot \cdots \cdot p_k^{a_k}\)
我们已知 n ,设 x = 1,对 n 分解质因数后只要 ai 出现次数为奇数次,我们就令 x 乘于这个 pi ,最后 x 就为每个出现次数为奇数次的 pi 的乘积。
ac代码
#include <iostream>
using namespace std;
typedef long long ll;
ll n;
ll x = 1;
int main()
{
cin >> n;
for (int i = 2; i <= n / i; i++)
{
if (n % i == 0)
{
int cnt = 0;
while (n % i == 0)
{
cnt++;
n /= i;
}
if (cnt & 1)
x *= i;
}
}
if (n > 1)
x *= n;
cout << x << endl;
return 0;
}