题目大意:
给出一个x,求满足x = b^p,p最大是多少?
解题思路:
x可以表示为:x = p1^e1 * p2^e2 * p3^e3 ....... * pn^en。
p = gcd (e1,e2,.......en);
x是负数的时候,p的值不能为偶数,这是坑点之一,还有一个是,题目上说只能用lld,我用的I64d,wa了一下午,想死的冲动都有了,直接上代码,我想静静~~~~~
代码:
1 #include <cstdio> 2 #include <cstring> 3 #include <cstdlib> 4 #include <algorithm> 5 #include <iostream> 6 #include <cmath> 7 using namespace std; 8 9 #define maxn 100010 10 int a[maxn], b[maxn]; 11 int k; 12 void prime () 13 { 14 long long i, j; 15 for(k=0, i=2; i<maxn; i++) 16 { 17 if (!a[i]) 18 { 19 b[k ++] = i; 20 for (j=i*i; j<maxn; j+=i) 21 a[j] = 1; 22 } 23 } 24 //printf ("%d ", k); 25 } 26 27 int gcd (int a, int b) 28 { 29 return a%b==0 ? b : gcd(b, a%b); 30 } 31 32 int main () 33 { 34 int t, l = 1; 35 long long n; 36 prime(); 37 scanf ("%d", &t); 38 while (t --) 39 { 40 int ans = 0, flag = 0; 41 scanf ("%lld", &n); 42 if (n < 0) 43 { 44 n = 0 - n; 45 flag = 1; 46 } 47 int i = 0; 48 while (b[i] < n && i < k) 49 { 50 if (n % b[i] == 0) 51 { 52 int j = 0; 53 while (n % b[i] == 0) 54 { 55 j ++; 56 n /= b[i]; 57 } 58 if (ans == 0) 59 ans = j; 60 else 61 ans = gcd (ans, j); 62 } 63 i ++; 64 } 65 if (n != 1)//有一个较大的因子没有筛选出来 66 ans = 1; 67 if (flag)//n是负数 68 while (ans % 2 == 0) 69 ans /= 2; 70 71 printf ("Case %d: %d ", l ++, ans); 72 } 73 return 0; 74 }