一、问题描述
一个整数
a
是一个完全平方数,是指它是某一个整数的平方,即存在一个整数b
,使得 a = b 2 a = b^2 a=b2。
给定一个正整数n
,请找到最小的正整数x
,使得它们的乘积是一个完全平方数。
输入格式: 输入一行包含一个正整数n
。
输出格式: 输出找到的最小的正整数x
。
示例 1
输入:12
输出:3
示例 2
输入:15
输出:15
评测用例规模与约定
对于 30% 的评测用例,1 ≤ n ≤ 1000,答案不超过 1000。
对于 60% 的评测用例,1 ≤ n ≤ 108,答案不超过108。
对于所有评测用例,1 ≤ n ≤ 1012,答案不超过1012。
二、问题分析
这道题是一道数论编程题,首先要知道质因子,才可以做这道题。虽然暴力可以解,但会超时。暴力也应该能拿部分分数。这里讲解一下知道质因子之后,要怎么解决问题。
x
x
x初始化为1,将
n
n
n分解成
n
n
n
=
=
=
p
1
a
1
p^{a_1}_ {1}
p1a1
×
×
×
p
2
a
2
p^{a_2}_ {2}
p2a2
×
⋅
⋅
⋅
×
×···×
×⋅⋅⋅×
p
i
a
i
p^{a_i}_ {i}
piai
⋅
⋅
⋅
×
···×
⋅⋅⋅×
p
r
a
r
p^{a_r}_ {r}
prar,若
a
i
a_i
ai为奇数,那
x
x
x就乘一个
p
i
p_i
pi。
三、代码实现
// 编程软件:Dev-C++ 5.4.0
#include<iostream>
using namespace std;
typedef long long ll;
int main(){
ll n;
cin >> n;
ll x = 1; // 最小正整数,初始化为1
for(int p=2; p*p<=n; p++){
if(n%p==0){
int a=0; // 记录一个质因子的指数
while(n%p==0){
n /= p;
a++;
}
if(a%2==1) x *= p; // 质因子指数为奇数,那x乘上一个质因子
}
}
if(n>1) x *= n; // 最后还有一个指数为1的质因子,那就再乘上一个质因子
cout << x;
return 0;
}