Perfect Pth Powers
题目链接:
http://poj.org/problem?id=1730
解题思路:
题目大意:
求使得 x = b^p成立时最大的p。
算法思想:
对x进行素数分解,即有x=a1^k1*a2^k2*…*ai^ki*… 其中ai均是素数,易知所有素数的指数ki的最大公约数即是题目所求。
坑点:n可以是负数。。。而且最后结果是偶数,显然是不可能的(一个数的偶次方怎么可能是负数),此时要不断将结果减半,直
到为奇数为止。
举例:64对应的结果应该是6,-64计算后也是6,显然不可能,应该为3,即(-4)^3=-64
AC代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
using namespace std;
const int N = 100005;
int vis[N+5];//这里必须要加一个非0数,不明觉厉
vector<int> prime;
void get_prime(){
prime.clear();
memset(vis,0,sizeof(vis));
for(int i = 2; i < N; ++i){
int t = N/i;
for(int j = 2; j <=t; ++j)
vis[i*j] = 1;
}
for(int i = 2; i < N; ++i){
if(!vis[i])
prime.push_back(i);
}
}
int gcd(int a,int b) {
if(b == 0)
return a;
else
return gcd(b,a%b);
}
int main(){
get_prime();
int n;
while(scanf("%d",&n),n) {
int len = prime.size();
int cnt,ans = -1;
for(int i = 0; i < len; ++i){
if(n%prime[i] == 0){
cnt = 0;
while(n%prime[i] == 0){
n /= prime[i];
cnt++;
}
if(ans == -1)
ans = cnt;
else
ans = gcd(ans,cnt);
}
}
if(ans == -1)
ans = 1;
if(n < 0){
while(ans % 2 == 0)
ans = ans/2;
}
printf("%d\n",ans);
}
return 0;
}