poj 1730 Perfect Pth Powers 筛法
Perfect Pth Powers
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 17478 | Accepted: 4014 |
Description

Input
Each test case is given by a line of input containing x. The value of x will have magnitude at least 2 and be within the range of a (32-bit) int in C, C++, and Java. A line containing 0 follows the last test case.
Output
For each test case, output a line giving the largest integer p such that x is a perfect p
th power.
Sample Input
17 1073741824 25 0
Sample Output
1 30 2
题意:给你一个n,求最大的p使得 存在一个x满足x^p=n;
思路:由算数基本定理把n分解成素数的乘积,然后求每个素数的指数的最大公约数就是答案了;
注意n是可以小于0的;小于0时只存在p是奇数的情况,所以一直把求得的最大公约数除以2直到它不是偶数,即是答案了;
还要注意的一点是输入有负的最大值,需要特判或用long long;
#include<iostream> #include<cstdio> #include<cmath> #include<cstring> #include<queue> #define M 100001 #define LL long long using namespace std; LL p[M]; bool visit[M]; LL np=0; LL gcd(LL a,LL b) { return b==0?a:gcd(b,a%b); } void iii() { memset(visit,true,sizeof(visit)); visit[1]=0; for(long long i=2; i<M; ++i) { if(visit[i]==true) { p[np++]=i; for(long long j=i*i; j<M; j+=i) { visit[j]=false; } } } } LL ans[100]; int main() { iii(); LL n,m,num,i,j,t,Min,d; while(~scanf("%lld",&n)) { if(n==0) break; m=n; if(n<0) n=-n; num=0; if(n==1) { printf("1\n"); continue; } d=sqrt(n+0.5); for(int w=0; w<100; w++) ans[w]=0; for(j=0; p[j]<=d; j++)//判断素数 { if(n%p[j]==0) { while(n%p[j]==0) { ans[num]++; n/=p[j]; } num++; } if(n==1) break; } if(n!=1) { printf("1\n"); continue; } Min=gcd(ans[0],ans[1]); for(i=2; i<num; i++) { Min=gcd(Min,ans[i]); } if(m<0) { while(Min%2==0) Min/=2; printf("%lld\n",Min); } else printf("%lld\n",Min); } return 0; }