题意:如果一个数n满足n=b^p,那么称n为p完美平方数。给定一个n,求最大的p使得其为p完美的。
思路:先对x进行质因数分解,因为x < 2 ^ 32,所以质因子最大为sqrt(2 ^ 32),把大约小于65537的质数扫一下,然后进行质因子分解。然后求出所有因子的最大公约数就可以得到p。但是当x时负数的时候,只能是奇数次方,所以要将p一直除2直到为奇数为止。
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
using namespace std;
#define clr(s,t) memset(s,t,sizeof(s))
#define M 65537
int len,prime[M],used[M+5],s[M];
long long n;
void init(){
int i,j;
clr(used, 0);
len = 0;
for(i = 2;i<M;i++){
if(used[i])
continue;
prime[len++] = i;
for(j = i;j<M;j+=i)
used[j] = 1;
}
}
int gcd(int x,int y){
return y?gcd(y, x%y):x;
}
int main(){
init();
while(scanf("%lld",&n)&&n){
int i,j,k,num=-1,res;
k = n<0;
if(n<0)
n = -n;
for(i = 0;prime[i]<=n && i<len;i++){
j = 0;
while(n%prime[i] == 0){
j++;
n /= prime[i];
}
if(j)
s[++num] = j;
}
if(i==len){//不能完全分解的情况,说明n是个质数
printf("1\n");
continue;
}
res = s[0];
for(i = 1;i<=num;i++)
res = gcd(res, s[i]);
if(k){//如果是负数,除直到得到奇数
while(res%2==0)
res/=2;
}
printf("%d\n",res);
}
return 0;
}