poj 1730 篩素數+因式分解(Perfect Pth Power)
阿新 • • 發佈:2019-02-10
題意:如果一個數n滿足n=b^p,那麼稱n為p完美平方數。給定一個n,求最大的p使得其為p完美的。
思路:先對x進行質因數分解,因為x < 2 ^ 32,所以質因子最大為sqrt(2 ^ 32),把大約小於65537的質數掃一下,然後進行質因子分解。然後求出所有因子的最大公約數就可以得到p。但是當x時負數的時候,只能是奇數次方,所以要將p一直除2直到為奇數為止。
#include <cstdio> #include <algorithm> #include <cstring> #include <cmath> using namespace std; #define clr(s,t) memset(s,t,sizeof(s)) #define M 65537 int len,prime[M],used[M+5],s[M]; long long n; void init(){ int i,j; clr(used, 0); len = 0; for(i = 2;i<M;i++){ if(used[i]) continue; prime[len++] = i; for(j = i;j<M;j+=i) used[j] = 1; } } int gcd(int x,int y){ return y?gcd(y, x%y):x; } int main(){ init(); while(scanf("%lld",&n)&&n){ int i,j,k,num=-1,res; k = n<0; if(n<0) n = -n; for(i = 0;prime[i]<=n && i<len;i++){ j = 0; while(n%prime[i] == 0){ j++; n /= prime[i]; } if(j) s[++num] = j; } if(i==len){//不能完全分解的情況,說明n是個質數 printf("1\n"); continue; } res = s[0]; for(i = 1;i<=num;i++) res = gcd(res, s[i]); if(k){//如果是負數,除直到得到奇數 while(res%2==0) res/=2; } printf("%d\n",res); } return 0; }