题意:给定x=b^p,x可能为负数,求最大的p。

思路:

 

LightOj 1220 (唯一分解定理应用)

x>0时分解质因子求GCD即可,当x为负数时,一直除以2直至奇数为止(为什么这样保证最大,不太懂)。

WA点:i*i爆精度超时、2^31负数爆精度超时。

AC代码:

#include <cstdio>
#include <cmath>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include<algorithm>
#include <set>
#include <queue>
#include <stack>
#include<vector>
#include<map>
#include<ctime>
using namespace std;
typedef long long LL;
const int N=100100;
int p[N];
int c[N];
int gcd(LL x,LL y)
{
    return y==0?x:gcd(y,x%y);
}
inline int divide(LL n)
{
    int m=0;
    for(LL i=2; i*i<=n; ++i)
    {
        if(n%i==0)
        {
            p[++m]=i;
            c[m]=0;
            while(n%i==0)n/=i,c[m]++;
        }
    }
    if(n>1)p[++m]=n,c[m]=1;//n为素数,不会进入上面的if
    int ans=c[1];
    for(int i=2; i<=m; ++i)ans=gcd(ans,c[i]);
    return ans;
}
int main()
{
    int t;
    scanf("%d",&t);
    int cas=0;
    while(t--)
    {
        LL x;
        scanf("%lld",&x);
        if(x>0)
        {
            int ans=divide(x);
            printf("Case %d: %d\n",++cas,ans);
        }
        else
        {
            int ans=divide(-x);
            while(ans%2==0)ans>>=1;
            printf("Case %d: %d\n",++cas,ans);
        }

    }

    return 0;
}

 

 

The end;

 

 

相关文章: