zoukankan      html  css  js  c++  java
  • 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
    ", 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 }
    本文为博主原创文章,未经博主允许不得转载。
  • 相关阅读:
    mysql学习总结(四)
    mysql学习总结(三)
    mysql学习总结(二)
    mysql学习总结
    学习总结(三十)
    断点续传
    错误总结
    学习总结(三十六)
    学习总结(三十五)
    Linux命令
  • 原文地址:https://www.cnblogs.com/alihenaixiao/p/4465179.html
Copyright © 2011-2022 走看看