题目:POJ-1730 Perfect Pth Powers
题目大意:判断一个数n,若有x^p=n,求p的最大值。
解题思路:这个题一开始瞄了一眼题解,发现pow还可以开根号,但是并不想怎么做,晚上睡觉的时候想起来可以用分解素因子的做法做,因为对数a,b,有a^p*b^p=(a*b)^p,这是其一,然后有a^(p1*p2)=(a^p1)^p2,综上所述,也就是找到数n的所有素因子a1,a2,...ar,以及个数b1,b2...br,然后求gcd(b1,b2...br)就可以了,这里,若n<0,那么还要求这个球出来的ans是一个奇数,也就求出来若是偶数,一直除2就行了。
AC代码:
#include<iostream>
#include<cmath>
#include<cstring>
#include<cstdio>
#include<algorithm>
#define maxn 1000010
using namespace std;
bool visit[maxn];
long long prime[maxn];
long long total,fun;
long long f[maxn][2];
void getprime(){
long long i,j;
memset (visit,0,sizeof(visit));
total=0;
for (i=2;i<maxn;i++){
if (!visit[i]){
for (j=2*i;j<maxn;j+=i){
visit[j]=1;
}
prime[++total]=i;
}
}
}
void getfactor(long long x){
if (x==1){
f[1][1]=1;
f[1][0]=1;
return ;
}
long long i;
long long xx=x;
fun=0;
for (i=1;prime[i]<=sqrt(x);i++){
if (xx%prime[i]==0){
f[++fun][0]=prime[i];
long long sum=0;
while (xx%prime[i]==0){
sum++;
xx/=prime[i];
}
f[fun][1]=sum;
}
}
if (xx!=1){
f[++fun][0]=xx;
f[fun][1]=1;
}
}
long long gcd(long long a,long long b){
return b==0?a:gcd(b,a%b);
}
int main(){
long long n,i,j;
getprime();
while (scanf("%lld",&n)!=EOF&&n){
if (n>0){
getfactor(n);
long long g=f[1][1];
for (i=2;i<=fun;i++){
g=gcd(g,f[i][1]);
}
printf("%lld\n",g);
}
else {
n=-n;
getfactor(n);
long long g=f[1][1];
for (i=2;i<=fun;i++){
g=gcd(g,f[i][1]);
}
if (g%2==0){
while (g%2==0){
g/=2;
}
}
printf("%lld\n",g);
}
}
}