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