Mysterious Bacteria LightOJ - 1220(质因数分解,gcd)

思路

将x质因数分解得到p1e1*p2e2 …*piei ,可知ans=gcd(e1,e2…ei).当x位负数时,指数必须为奇数,所以一直将答案除以二到奇数为止.

代码

#include<map>
#include<set>
#include<cmath>
#include<stack>
#include<queue>
#include<cstdio>
#include<string>
#include<vector>
#include<cstring>
#include<iomanip>
#include<sstream>
#include<iostream>
#include<algorithm>
#define INF 0x3f3f3f3f
#define mod 123
#define int ll
typedef long long ll;
const int MAXN=1e5+10;
using namespace std;
//-------------------------------------------//
int pri[MAXN],phi[MAXN],p[MAXN],e[MAXN],k;
void getprime()
{
    
    
    phi[1]=1;
    for(int i=2;i<MAXN;++i)
    {
    
    
        if(!phi[i])
        {
    
    
            pri[k++]=i;
            for(int j=i*2;j<MAXN;j+=i)
                if(!phi[j])phi[j]=1;
        }
    }
}
signed main()
{
    
    
    ios::sync_with_stdio(false);
    getprime();
    int t;
    cin>>t;
    for(int cas=1;cas<=t;++cas)
    {
    
    
        memset(e,0,sizeof e);
        int x;
        bool falg=false;
        cin>>x;
        if(x<0)x=-x,falg=true;
        int cnt=0;
        for(int i=0;i<k&&pri[k]<=x;++i)
        {
    
    
            if(x%pri[i]==0)
            {
    
    
                x/=pri[i];
                p[++cnt]=pri[i];
                e[cnt]++;
            }
            while(x%pri[i]==0)x/=pri[i],e[cnt]++;
        }
        if(x>1)e[++cnt]=1;
        int ans=0;
        for(int i=1;i<=cnt;++i)ans=__gcd(ans,e[i]);
        if(falg)while(ans%2==0)ans/=2;
        cout<<"Case "<<cas<<": "<<ans<<endl;
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_43638337/article/details/103937680