POJ 1730 Perfect Pth Power

来源:互联网 发布:淘宝代码有何用 编辑:程序博客网 时间:2024/06/07 01:13

题意:求出使y^p=x成立最大p值.

先对x进行素数分解,有X=(fac[1]^tn[1])*(fac[2]^tn[2])....(fac[n]^tn[n])   (fac为X的素数因子,tn为对应的次方数)

显然p=gcd(tn[1],tn[2],.....,tn[n]).

注意当n为负数时,p必须为奇数


#include <cstdio>#include <iostream>using namespace std;const int maxn=100000+10;bool isprime[maxn];int prime[maxn];void init(){    for(int i=1;i<maxn;i+=2) isprime[i]=1,isprime[i-1]=0;    for(int i=3;i<maxn;i+=2)        if(prime[i]){        for(int j=i*i;j<maxn;j+=i) isprime[j]=0;    }    isprime[1]=0,isprime[2]=1;    int k=0;    for(int i=2;i<maxn;i++)        if(isprime[i]) prime[++k]=i;    prime[0]=k;}int fac[10],tn[10];void divide(long long x){    int k=0;    for(int i=1;i<prime[0]&&(long long)prime[i]*prime[i]<=x;i++)        if(x%prime[i]==0){            fac[++k]=i;            int s=0;            while(x%prime[i]==0) x/=prime[i],s++;            tn[k]=s;        }    if(x>1) fac[++k]=x,tn[1]=1;    fac[0]=tn[0]=k;}int gcd(int x,int y){    return y==0?x:gcd(y,x%y);}int main(){    init();    long long n;    while(cin>>n,n){        bool flag=0;        if(n<0){            flag=1;            n=-n;        }        divide(n);        int ans=tn[1];        for(int i=2;i<=tn[0];i++)            ans=gcd(ans,tn[i]);        if(flag&&ans%2==0){            while(ans%2==0) ans/=2;        }        cout<<ans<<endl;    }    return 0;}


原创粉丝点击