问题
分析
将n唯一因数分解,然后求各个质因数的gcd,要注意复数的gcd中不能有2这个因子
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <vector>
using namespace std;
typedef long long LL;
const LL maxn=47000,Inf=0x3f3f3f3f;
int isprime[maxn],prime[maxn],pn=0,factor[maxn],pf=0;
void getPrime(){
fill(isprime,isprime+maxn,1);
for(LL i=2;i<maxn;++i){
if(isprime[i]) prime[pn++]=i;
for(int j=0;j<pn && i*prime[j]<maxn;++j){
isprime[i*prime[j]]=0;
if(i%prime[j]==0) break;
}
}
}
void solve(LL x){
pf=0;
for(int i=0;i<pn;++i){
int flag=true,t=0;
while(x%prime[i]==0){
flag=false;
x=x/prime[i];
++t;
}
if(!flag){
factor[pf++]=t;
}
if(x==1) break;
}
if(x>1){
factor[pf++]=1;
}
}
inline LL gcd(LL a,LL b){
return (b==0)?a:gcd(b,a%b);
}
LL n,flag;
int main(void){
getPrime();
while(scanf("%lld",&n)==1 && n){
if(n<0){
n=-n;
solve(n);
flag=-1;
}else{
solve(n);
flag=1;
}
LL g=factor[0];
for(LL i=1;i<pf;++i){
g=gcd(g,factor[i]);
}
if(flag<0){
while(!(g&1)){
g>>=1;
}
}
printf("%lld\n",g);
}
return 0;
}