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;
}

 

posted @ 2012-06-15 21:28  yejinru  阅读(310)  评论(0编辑  收藏  举报