问题描述
给定一个正整数n,求一个正整数p,满足p仅包含n的所有素因子,且每个素因子的次数不大于1
输入格式
一个整数,表示n
输出格式
输出一行,包含一个整数p。
样例输入
1000
样例输出
10
数据规模和约定
n<=10^12
样例解释:n=1000=2^3*5*3,p=2*5=10
#include <stdio.h>
#include <cmath>
const int maxn=1000;
bool p[maxn]={false};
int pNum=0,prime[maxn];
struct factor{
int x,cnt;//x为质因数,cnt表示其个数
}fac[20];
void find_prime(){//打表
for(int i=2;i<maxn;i++){
if(p[i]==false){
prime[pNum++]=i;
for(int j=i+i;j<maxn;j+=i){
p[j]=true;
}
}
}
}
int main(){
find_prime();
long long n,num=0;
scanf("%lld",&n);
long long sqr=(long long)sqrt(1.0*n);
for(int i=0;i<pNum&&prime[i]<=sqr;i++){
if(n%prime[i]==0){//如果prime[i]是n的质因子
fac[num].x=prime[i];//记录该质因子
fac[num].cnt=0;
while(n%prime[i]==0){//计算出其个数
fac[num].cnt++;
n=n/prime[i];
}
num++;
}
if(n==1){
break;
}
}
if(n!=1){//如果无法被根号n以内的质因子除尽
fac[num].x=n;//那么一定有一个大于根号n的质因子
fac[num++].cnt=1;
}
long long sum=1;
for(int i=0;i<num;i++){
sum*=fac[i].x;
}
printf("%lld\n",sum);
return 0;
}