给出n,求n=b^d的最大d
分解n=p1^ap2^bp3^c..
要使n=(p1^(a/d) p2^(b/d) p3^(c/d))^d&&d最大 则d为cnt个因子 幂的gcd
#include <iostream>
#include <cstring>
#include <vector>
using namespace std;
typedef long long ll;
const int N=333333;
int p,num;
int prime[N+20],vis[N+20],cnt=0;
int ans;
int gcd(int a,int b)
{
return b==0?a:gcd(b,a%b);
}
void solve(ll n)
{
ll m=n;
if(n<0)
n=-n;
for(int i=0;i<cnt&&prime[i]<=n;i++)//分解n=p1^ap2^bp3^c..
{ //144// 给出n,求n=b^d的最大d
//分解n=p1^ap2^bp3^c..
//要使n=(p1^(a/d) p2^(b/d) p3^(c/d))^d&&d最大 则d为cnt个因子 幂的gcd
int cnt=0;
while(n%prime[i]==0)
{
n/=prime[i];
cnt++;
}
ans=gcd(ans,cnt);
}
if(ans==0)
ans=1;//素数
if(m<0)//负数的情况 -64 2^6=4^3
{
while(ans%2==0)//幂次方必须为奇数
{
ans/=2;
}
}
}
int main()
{
ll n;
memset(vis,0,sizeof(vis));
for (int i = 2; i < N; i++) {
if (vis[i])
continue;
prime[cnt++] = i;
for (int j = i; j < N; j += i)
vis[j] = 1;
}
while(scanf("%lld",&n)!=EOF&&n)
{
ans=0;
solve(n);//分解n
cout<<ans<<endl;
}
return 0;
}