LightOj 1220 Mysterious Bacteria

题目大意:

  给出一个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\n", 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\n", l ++, ans);
72     }
73     return 0;
74 }

 

posted @ 2015-04-29 10:17  罗茜  阅读(421)  评论(0编辑  收藏  举报