题目大意:
给你一个数x = b^p,求p的最大值
分析:x=p1^a1 * p2^a2 . . .pn^an
x只有一个因子的p次幂构成
所以,本题所求实质上就是求 :a1,a2,a3,a4…an的最大公约数
本题有一个坑,就是x可能为负数,如果x为负数的话,x = b^q, q必须使奇数,所以将x转化为正数求得的解如果是偶数的话必须将其一直除2转化为奇数
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e5+10;
int pri[N];
bool vis[N];
void prime() {
memset(vis,false,sizeof(vis));
for(int i=2; i<=N; i++) {
if(!vis[i]) {
pri[++pri[0]]=i;
}
for(int j=1; j<=pri[0] && i*pri[j]<=N; j++) {
vis[i*pri[j]]=true;
if(i%pri[j]==0) {
break;
}
}
}
} // 欧拉筛
int gcd(int a, int b) {
return b ? gcd(b,a%b) : a;
}
int main()
{
prime();
int t,cnt=0;
scanf("%d", &t);
while(t--) {
bool flag=true;
ll x,ans=0; //int范围是-2^31——2^31-1,对于32bit signed interger会爆in
scanf("%lld", &x);
//x的值可能小于0
if(x<0) {
x=-x;
flag = false;
}
for(int i=1; i<=pri[0]&&pri[i]<=sqrt(x); i++) {
if(x%pri[i]==0) {
int k=0;
while(x%pri[i]==0) {
x/=pri[i];
k++;
}
if(ans==0) {
ans=k;//第一个
}
else {
ans=gcd(ans,k);
}
}
}
//如果没有被sqrt内的质数唯一分解,则说明还有有大于sqrt且在分解定理中一次的质数。
if(x>1) {
ans=gcd(ans,1);
}
//若是负数,则不可能为偶数次方构成
if(!flag) {
while(ans%2==0) {
ans/=2;
}
}
printf("Case %d: %d\n",++cnt,ans);
}
return 0;
}