uva 10622 Perfect P-th Powers // poj 1730 Perfect P-th Powers

/*



题目:

    给出n,问n = b^p中p符合该等式的最大值



分析:

    先求出所有n的质因子,然后对这m个质因子分类统计,比如

    n = 36时,可以分成 2个2,2个3,然后求出所有这些基数的

    最大公因数gcd。另外由于有负数的存在,所以求到的gcd若

    为偶数时,需要不断除二直到为奇数为止



*/

#include <iostream>

#include <cstdio>

#include <cstring>

#include <cmath>



using namespace std;



const int X = 150000;



int di[50],top;

int prime[15000],cnt;

bool notprime[X];

int num[X];

int ans[50];





void init() //筛法

{

    cnt = 0;

    memset(notprime,false,sizeof(notprime));

    for(int i=2;i<X;i++)

        if(!notprime[i])

        {

            prime[++cnt] = i;

            for(int j=i+i;j<X;j+=i)

                notprime[j] = true;

        }

}



int gcd(int a,int b)

{

    if(a==0)

        return b;

    return gcd(b%a,a);

}



int main()

{

    freopen("sum.in","r",stdin);

    freopen("sum.out","w",stdout);

    long long n;

    int half;

    init();

    while(cin>>n,n)

    {

        memset(num,0,sizeof(num));

        long long temp = max(n,-n);

        half = (int)sqrt(temp*1.0);

        top = 0;

        for(int i=1;prime[i]<=half+1;i++)   //求出所有质因数

            if(temp%(long long)prime[i]==0)

            {

                temp /= prime[i];

                di[++top] = prime[i];

                i--;

                num[di[top]]++;

                if(!temp||temp==1)

                    break;

            }

        if(top==0)

        {

            printf("1\n");

            continue;

        }



        memset(ans,0,sizeof(ans));

        int head = 0;



        for(int i=1;i<=top;i++)

            ans[++head] = num[di[i]],num[di[i]] = 0;

        int res = ans[1];

        for(int i=2;i<=head;i++)

        {

            res = gcd(res,ans[i]);

            if(res==1)

                break;

        }

        if(n<0)

        {

            if(res%2==0)

            {

                while(res%2==0)

                    res >>= 1;

                printf("%d\n",res);

            }

            else

                cout<<res<<endl;

        }

        else

            printf("%d\n",res);

    }

    return 0;

}

 

你可能感兴趣的:(poj)