代码比较简单,唯一分解
// UVA 10622
#include <iostream>
#include <vector>
using namespace std;
typedef long long ll;
#define PMAX 50000
int a[PMAX];
vector<ll> prime;
void init(){
for(ll i=2 ; i*i<PMAX; i++){
if(a[i]) continue;
for(ll j=i*i;j<PMAX;j+=i) a[j]=1;
}
for(int i =2; i< PMAX; i++)
if(!a[i]) prime.push_back(i);
}
int gcd(int a ,int b){
return b == 0? a : gcd(b, a%b);
}
int solve(ll n){
ll nn=n;
n= n<0? -n:n;
int ans=0;
for( int i = 0; i< prime.size() && prime[i]<=n ; i++){
int num =0 ;
while (n % prime[i] == 0){
num++;
n /= prime[i];
}
ans =gcd(ans , num);
}
if( ans == 0) ans =1;
if(nn < 0){
while(ans % 2 ==0) ans =(ans>>1);
}
return ans;
}
int main(){
init();
ll nn;
while(cin>>nn ,nn){
cout<<solve(nn)<<endl;
}
return 0;
}
//int is_prime(int num){
// if(num==1) return 0;
// if(num<PMAX) return !p[num];
// for(int i = 2; i*i < num && i < PMAX; i++){
// if(p[i]) continue;
// if(num%i==0) return 0;
// }
// return 1;
//}