POJ 1730 Perfect Pth Powers(素数筛选法)

来源:互联网 发布:广数928螺纹编程格式 编辑:程序博客网 时间:2024/06/05 02:09

Perfect Pth Powers

题目链接:

http://poj.org/problem?id=1730

解题思路:

题目大意:

求使得 x = b^p成立时最大的p。

算法思想:

对x进行素数分解,即有x=a1^k1*a2^k2*…*ai^ki*… 其中ai均是素数,易知所有素数的指数ki的最大公约数即是题目所求。

坑点:n可以是负数。。。而且最后结果是偶数,显然是不可能的(一个数的偶次方怎么可能是负数),此时要不断将结果减半,直

到为奇数为止。

举例:64对应的结果应该是6,-64计算后也是6,显然不可能,应该为3,即(-4)^3=-64

AC代码:

#include <iostream>#include <cstdio>#include <cstring>#include <vector>using namespace std;const int N = 100005;int vis[N+5];//这里必须要加一个非0数,不明觉厉vector<int> prime;void get_prime(){    prime.clear();    memset(vis,0,sizeof(vis));    for(int i = 2; i < N; ++i){        int t = N/i;        for(int j = 2; j <=t; ++j)            vis[i*j] = 1;    }    for(int i = 2; i < N; ++i){        if(!vis[i])            prime.push_back(i);    }}int gcd(int a,int b) {    if(b == 0)        return a;    else        return gcd(b,a%b);}int main(){    get_prime();    int n;    while(scanf("%d",&n),n) {        int len = prime.size();        int cnt,ans = -1;        for(int i = 0; i < len; ++i){            if(n%prime[i] == 0){                cnt = 0;                while(n%prime[i] == 0){                    n /= prime[i];                    cnt++;                }                if(ans == -1)                    ans = cnt;                else                    ans = gcd(ans,cnt);            }        }        if(ans == -1)            ans = 1;        if(n < 0){            while(ans % 2 == 0)                ans = ans/2;        }        printf("%d\n",ans);    }    return 0;}


0 0
原创粉丝点击