题意:
对于32位有符号整数x,将其写成x = bp的形式,求p可能的最大值。
分析:
将x分解质因数,然后求所有指数的gcd即可。
对于负数还要再处理一下,负数求得的p必须是奇数才行。
1 #include <cstdio> 2 #include <cmath> 3 4 const int maxn = 46500; 5 bool vis[maxn + 10]; 6 int prime[4810], cnt = 1; 7 8 void Init() 9 { 10 int m = sqrt(maxn + 0.5); 11 for(int i = 2; i <= m; ++i) if(!vis[i]) 12 for(int j = i * i; j <= maxn; j += i) vis[j] = true; 13 for(int i = 2; i <= maxn; ++i) if(!vis[i]) prime[cnt++] = i; 14 cnt--; 15 } 16 17 int gcd(int a, int b) 18 { 19 return b == 0 ? a : gcd(b, a % b); 20 } 21 22 int solve(int n) 23 { 24 int ans = 0; 25 for(int i = 1; i <= cnt; ++i) 26 { 27 int k = 0; 28 while(n % prime[i] == 0) 29 { 30 k++; 31 n /= prime[i]; 32 } 33 if(k) 34 { 35 if(k == 1) return 1; 36 ans = gcd(k, ans); 37 } 38 } 39 if(n > 1) return 1; 40 return ans; 41 } 42 43 int main() 44 { 45 Init(); 46 47 int n; 48 while(scanf("%d", &n) == 1 && n) 49 { 50 int ans = solve(n < 0 ? -n : n); 51 if(n < 0) while((ans & 1) == 0) ans >>= 1; 52 printf("%d ", ans); 53 } 54 55 return 0; 56 }