1220 - Mysterious Bacteria--LightOj1220 (gcd)

http://lightoj.com/volume_showproblem.php?problem=1220

题目大意: 给你一个x,求出满足 x=b^p, p最大是几。

分析:x=p1^a1*p2^a2*...*pn^an;

p最大是gcd(a1,a2,...,an)。

///他该诉你x,b,p都是整数,所以x,b有可能是负数。当x是负数时,p不能是偶数。

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<algorithm>
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
#include<algorithm>
#include<iostream>
#include<vector>
#include<queue>

using namespace std;
typedef long long LL;
#define N 100000
#define ESP 1e-8
#define INF 0x3f3f3f3f
#define memset(a,b) memset(a,b,sizeof(a))

LL prime[N], k;
bool vis[N];

void Prime()
{
    memset(vis, false);
    k = 0;
    for(int i=2; i<N; i++)
    {
        if(vis[i] == 0)
        {
            prime[k ++] = i;
            for(int j=i+i; j<N; j+=i)
            {
                vis[j] = 1;
            }
        }
    }
}

LL gcd(LL a, LL b)
{
    LL r;
    while(b)
    {
        r = a%b;
        a = b;
        b = r;
    }
    return a;
}

LL solve(LL n)
{
    LL ans, sum;
    ans = 0;
    sum = 1;
    int flag = 0;

    for(int i=0; prime[i]*prime[i] <= n; i++)
    {
        if(n%prime[i] == 0)
        {
            ans = 0;
            while(n%prime[i] == 0)
            {
                n /= prime[i];
                ans ++;
            }
            if(flag == 0)
            {
                sum = ans;
                flag = 1;
            }
            else if(flag == 1)
                sum = gcd(sum, ans);
        }
    }
    if(n>1)
        sum = 1;

    return sum;
}

int main()
{
    int T, t=1;
    Prime();
    scanf("%d", &T);
    while(T --)
    {
        LL n;
        scanf("%lld", &n);

        int b = 0;

        if(n<0)
        {
            n = -n;
            b = 1;
        }

        LL sum = solve(n);

        if(b == 1 && sum%2 == 0)
        {
            while(sum%2 == 0)
                sum/=2;
        }
        printf("Case %d: %lld\n", t++, sum);
    }
    return 0;
}

 

posted @ 2016-06-01 16:00  啦咯  阅读(232)  评论(0编辑  收藏  举报