题意:
对于32位有符号整数x,将其写成x = bp的形式,求p可能的最大值。
分析:
将x分解质因数,然后求所有指数的gcd即可。
对于负数还要再处理一下,负数求得的p必须是奇数才行。
1 #include2 #include 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\n", ans);53 }54 55 return 0;56 }