2025.10.29__jyu每日一题题解

完全平方数

题目大意

给定一个正整数 \(n\),找到最小的正整数 x,使得它们的乘积是一个完全平方数。

思路

算术基本定理指出:任何大于1的自然数 \(N\),要么本身是素数,要么可以唯一地分解为有限个素数的乘积。具体表述为:

\[N = p_1^{a_1} p_2^{a_2} \cdots p_k^{a_k} \]

其中 \(( p_1 < p_2 < \cdots < p_k )\) 为素数,\(a_i\) 为正整数,且这种分解方式在不考虑素数排列顺序时是唯一的。

如果我们分解完全平方数,就会发现它分解出来的素数的指数都为偶数。

证明也很简单:
一个完全平方数 n 必然可以由 sqrt(n) * sqrt(n) 得到。
每个 sqrt(n) 可以根据算数基本定理分解成若当素数的乘积。
然后两个 sqrt(n) 相乘去得到 n,那么相当于每一个素数的指数乘2,那么得到的 n 根据算数基本定理分解出来的若当素数的指数必然是偶数。
ps: sqrt(n) 表示 n 的开方

如果我们想让 \(n\) 乘上某一个数 \(x\) 之后变成完全平方数,相当于是让 \(n\) 分解出来的素数的指数全都变为偶数。
具体的操作就是:
分解 \(n\), 如果分解出来的某一个素数的指数是奇数,那我们要补一个这个素数才能使它的指数变成偶数,说明答案的 x 要可以分解出一个这个素数。
依次检验每一个分解出来的素数即可。

代码

点击查看代码
void solve(){
	cin >> n;
	int x = 1;
	for(int i = 2; i <= n / i; i ++){
		if(n % i == 0){
			int cnt = 0;
			while(n % i == 0) n /= i, cnt ++;
			if(cnt % 2 == 1) x *= i;
		}
	}
	if(n != 1) x *= n;
	cout << x << endl;
}
posted @ 2025-10-29 20:23  _hu  阅读(37)  评论(0)    收藏  举报