首页 > 其他 > 详细

[整数分解+dfs] light oj 1220 Mysterious Bacteria

时间:2015-03-26 20:56:09      阅读:314      评论:0      收藏:0      [点我收藏+]

题意:

给一个x,问让它被表示成b^p(b的p次方)。p最大是多少。

思路:

将x分解,得到质因子以及个数。

我们知道x是每个质因子幂的乘积,所以要使得p最大,就是幂最大。

最大其实就是这些质因子个数的最大公约数。

因为超过的就变成乘积放进去。

然后要注意这题输入的x可能是负数。

负数的话要去掉2的约数。

代码:

#include"cstdio"
#include"cstring"
#include"cmath"
#include"cstdlib"
#include"algorithm"
#include"iostream"
#include"map"
#include"queue"
#define ll long long
using namespace std;
#define MAXN 1000007
bool mark[MAXN];
int ss[MAXN],sscnt;
int gcd(int a,int b)
{
    return b==0?a:gcd(b,a%b);
}
void ssb()
{
    sscnt=0;
    memset(mark,false,sizeof(mark));
    mark[0]=mark[1]=true;
    for(int i=2; i<=MAXN; i++)
    {
        if(!mark[i])
        {
            for(int j=i+i; j<=MAXN; j+=i) mark[j]=true;
            ss[sscnt++]=i;
        }
    }
    return ;
}
int main()
{
    int t,cas=1;
    cin>>t;
    ssb();
    while(t--)
    {
        ll n;
        int f=0;
        scanf("%lld",&n);
        if(n<0) f=1,n=-n;
        int ans=0;
        for(int i=0; i<sscnt; i++)
        {
            if((ll)ss[i]*ss[i]>n) break;
            if(n%ss[i]==0)
            {
                int tep=0;
                while(n%ss[i]==0)
                {
                    tep++;
                    n/=ss[i];
                }
                if(ans==0) ans=tep;
                else ans=gcd(ans,tep);
            }
        }
        if(n!=1) ans=1;
        if(f)
        {
            while(ans%2==0) ans/=2;
        }
        printf("Case %d: %d\n",cas++,ans);
    }
    return 0;
}


[整数分解+dfs] light oj 1220 Mysterious Bacteria

原文:http://blog.csdn.net/wdcjdtc/article/details/44653913

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!