标签:数学
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 16746 | Accepted: 3799 |
Description
Input
Output
Sample Input
17 1073741824 25 0
Sample Output
1 30 2
题意:给出一个整数x,把x写成x=a^p,求p最大是多少?
分析:把x分解质因数,x = a1^b1 * a2^b2 … ak^bk,则最终结果为b1,b2,…bk的最大公约数。注意x有可能是负数。
如果x是负数,则要把求得的答案一直除以2,知道结果一个奇数,因为一个数的偶数次方不可能是负数。
#include <cstdio> #include <cmath> #include <cstring> const int N = 66700; int is[N]; int prime[7000], prime_cnt; void get_prime() { for(int i = 0; i < N; i++) is[i] = 1; is[0] = is[1] = 0; prime_cnt = 0; int m = (int)sqrt(N + 0.5); for(int i = 2; i < N; i++) { if(is[i]) { prime[prime_cnt++] = i; if(i <= m) { for(int j = i * i; j < N; j += i) is[j] = 0; } } } } int gcd(int a, int b) { if(a < b) return gcd(b, a); if(b == 0) return a; return gcd(b, a % b); } int main() { get_prime(); long long n; //不知道当n为int时为什么会TLE while(~scanf("%lld", &n) && n) { int flag = 0; if(n < 0) { flag = 1; n = -n; } int ans = 0; for(int i = 0; i < prime_cnt && n > 1; i++) { if(n % prime[i] == 0) { int cnt = 0; while(n % prime[i] == 0) { n /= prime[i]; cnt++; } ans = gcd(ans, cnt); } } if(n > 1) ans = gcd(ans, 1); if(flag) { while(ans % 2 == 0) ans /= 2; } printf("%d\n", ans); } return 0; }
poj 1730Perfect Pth Powers(分解质因数)
标签:数学
原文地址:http://blog.csdn.net/lyhvoyage/article/details/40210323