其他分享
首页 > 其他分享> > LightOJ1220 Mysterious Bacteria(唯一分解+负数处理)

LightOJ1220 Mysterious Bacteria(唯一分解+负数处理)

作者:互联网

题意:

给你一个整数n(可能为负数),让你求满足a^p=n的最大的p

思路:

当n是正数时,直接对n进行素因子分解,在对它的素因子的个数进行gcd,比如12=2^2*3,gcd(2,1)就是最大的p;

当n是负数时,则p的值一定是奇数,因为一个数的偶数次方一定为整数,因此需要将它的素因子个数全都化为奇数。

#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 1e7 + 10;
int t, n, suyz[1000], ans, flag;
vector<int>p;
bool isp[N];
void prime() {
    isp[0] = isp[1] = 1;
    for(int i = 2; i < N; i++) {
        if(!isp[i])
            p.push_back(i);
        for(int j = 0; j < p.size() && i * p[j] < N; j++) {
            isp[i * p[j]] = 1;
            if(!(i % p[j]))
                break;
        }
    }
}
int euler(int n) {
    int ans = 0, sum = 0;
    for(int i = 0; i < p.size() && p[i]*p[i] <= n; i++) {
        if(n % p[i] == 0) {
            ans = 0;
            while(n % p[i] == 0) {
                ans++;
                n /= p[i];
            }
            if(flag)
                while(ans % 2 == 0 && ans)
                    ans /= 2;
            sum = __gcd(sum, ans);
        }
    }
    if(n > 1)
        sum = __gcd(sum, 1ll);
    return sum;
}
int32_t main() {
    cin >> t;
    int s = 1;
    prime();
    while(t--) {
        cin >> n;
        ans = 0, flag = 0;
        if(n < 0) {
            n = -n;
            flag = 1;
        }
        ans = euler(n);
        printf("Case %lld: %lld\n", s++, ans);
    }
    return 0;
}

 

标签:gcd,LightOJ1220,int,sum,isp,flag,ans,Mysterious,Bacteria
来源: https://blog.csdn.net/Endeavor_G/article/details/89380414