题目
问题规模:
分析
本题为质因数分解.
本题的证明(不保证正确性,仅仅为个人思考的过程):
题目中N,X均为正整数(为避免冲突使用大写).
则由题意得∃ 正整数 K , 使得 N ∗ X = K 2 \exists 正整数K,使得N*X = K^2 ∃ 正 整 数 K , 使 得 N ∗ X = K 2 ,对3者分解质因数得:
N = q 1 ∗ q 2 ∗ q 3 ∗ . . . ∗ q n X = p 1 ∗ p 2 ∗ p 3 ∗ . . . ∗ p m K = s 1 ∗ s 2 ∗ s 3 ∗ . . . ∗ s r N = q_1 * q_2 * q_3 * ... * q_n \\
X = p_1 * p_2 * p_3 * ... * p_m \\
K = s_1 * s_2 * s_3 * ... * s_r
N = q 1 ∗ q 2 ∗ q 3 ∗ . . . ∗ q n X = p 1 ∗ p 2 ∗ p 3 ∗ . . . ∗ p m K = s 1 ∗ s 2 ∗ s 3 ∗ . . . ∗ s r
其中q i , p i 和 s i q_i,p_i和s_i q i , p i 和 s i 均为素数,则有K 2 = s 1 2 ∗ s 2 2 ∗ s 3 2 ∗ . . . ∗ s r 2 K^2 = s^2_{1}*s^2_{2}*s^2_{3}*...*s^2_{r} K 2 = s 1 2 ∗ s 2 2 ∗ s 3 2 ∗ . . . ∗ s r 2
根据唯一分解定理
得:若有素数p 1 , p 2 , p 3 p_1,p_2,p_3 p 1 , p 2 , p 3 ,且p 1 ∗ p 2 = p 3 2 ( = Q ) p_1 * p_2 = p^2_3(=Q) p 1 ∗ p 2 = p 3 2 ( = Q ) ,则p 1 = p 2 = p 3 p_1=p_2=p_3 p 1 = p 2 = p 3 ,即对Q的分解是唯一的.
因此有s i 2 = a 2 s^2_i = a^2 s i 2 = a 2 ,其中$a \in {p_i} \cup {q_i} $.
(博客公式处理有问题,下面放个截图吧……)
所以,对于N ∗ X N*X N ∗ X 的所有质因数而言:
N ∗ X = p 1 a 1 ⋅ p 2 a 2 ⋅ … ⋅ p k a k N*X = p_1^{a_1} \cdot p_2^{a_2} \cdot \ldots \cdot p_k^{a_k}
N ∗ X = p 1 a 1 ⋅ p 2 a 2 ⋅ … ⋅ p k a k
该式中a i a^i a i 必然为偶数,但是由于:
N = p 1 a 1 ⋅ p 2 a 2 ⋅ … ⋅ p k a k N = p_1^{a_1} \cdot p_2^{a_2} \cdot \ldots \cdot p_k^{a_k}
N = p 1 a 1 ⋅ p 2 a 2 ⋅ … ⋅ p k a k
该式中a i a^i a i 不一定为偶数.(注意上面2式中同名变量无关)
因此,对于X的质因数分解,只需要保证能够和N的质因数分解"互补",即乘积的幂为偶数即可.
换句话说,为了求解X,初始令X=1,如果N的分解中某一个p i a i p^{a^i}_i p i a i ,a i a^i a i 为奇数,则X ∗ = p i X*=p_i X ∗ = p i ;否则X不变.
之所以只乘p i p_i p i ,即p i p_i p i 的一次幂,而不是更高次,是因为要求X的最小值
分析到此结束,代码就是套用标准的质因数分解
外加一些判断.
代码
使用C语言编写.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 #include <stdio.h> long long x = 1 ;void primeFactorization (long long n) { int cnt = 0 ; for (long long i = 2 ; i * i <= n; ++i) { cnt = 0 ; while (n % i == 0 ) { n /= i; cnt++; } if (cnt & 1 ) { x *= i; } } if (n != 1 ) { x *= n; } } int main () { long long n; scanf ("%lld" , &n); primeFactorization(n); printf ("%lld" , x); return 0 ; }