问题描述
给定一个正整数n,求一个正整数p,满足p仅包含n的所有素因子,且每个素因子的次数不大于1
输入格式
一个整数,表示n
输出格式
输出一行,包含一个整数p。
样例输入
1000
样例输出
10
数据规模和约定
n<=10^12
样例解释:n=1000=2^3*5*3,p=2*5=10
注意n应该是long long类型
#include <bits/stdc++.h>
using namespace std;
#define MAX 150005
#define MOD 1000000007
typedef long long LL;
const int INF = 1e9+7;
const int VM = 10005;
#define N 1000005
bool isprime[N];
LL prime[N];
int cnt;
void getpri()
{
LL i;
int j;
cnt=0;
memset(isprime,false,sizeof(isprime));
for(i=2; i<1000000LL; i++)
{
if(!isprime[i])
prime[cnt++]=i;
for(j=0; j<cnt&&prime[j]*i<1000000LL; j++)
{
isprime[i*prime[j]]=1;
if(i%prime[j]==0)break;
}
}
}
int main()
{
getpri();
LL n;
int i;
cin>>n;
LL sum=1;
for(i=0;i<cnt&&prime[i]*prime[i]<=n;i++){
if(n%prime[i]==0){
sum*=prime[i];
while(n%prime[i]==0){
n/=prime[i];
}
}
}
if(n>1)//模剩的恰好是素因子
sum*=n;
cout<<sum<<endl;
return 0;
}