1. 程式人生 > >poj 1730 篩素數+因式分解(Perfect Pth Power)

poj 1730 篩素數+因式分解(Perfect Pth Power)

題意:如果一個數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;
}