求满足条件的最大的指数p,使得a^p = x(a是整数)
Input
输入包含多组样例T(T<=50),每个样例包括一个整数x,x的范围在32位二进制数以内, 保证x的绝对值大于等于2。
Output
对于每个样例输出最大的指数p。
Sample Input
3
17
1073741824
25
Sample Output
Case 1: 1
Case 2: 30
Case 3: 2
对指数进行记录质数的指数,并记录指数的gcd,记得会出现负数要化成正数并打标记最后处理
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<map>
#include<stack>
#include<set>
#include<queue>
#include<vector>
#include<stdlib.h>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<cstdlib>
#define inf 0x3f3f3f3f
using namespace std;
typedef long long ll;
const int maxn=1e7+6;//maxn*maxs
const int maxs=1e8+10;
const int mod=998244353;
ll pri[maxn / 10], cnt;
bool ispri[maxn];
void init()
{
for(int i = 2; i <maxn; i++) {
if(!ispri[i]) {
pri[cnt++] = i;
}
for(int j = 0; j < cnt && pri[j] * i <maxn; j++) {
ispri[i * pri[j]] = true;
if(pri[j] % i == 0) break;
}
}
}//素数筛
int gcd(int a, int b)
{
int tmp;
while(b) {
tmp = a % b;
a = b;
b = tmp;
}
return a;
}
int main()
{
init();
int t;
cin>>t;
ll tmp,ans;
int cas=0;
while(t--){
ll n;
cin>>n;
int flag;
if(n<0) n=-n,flag=-1;
else flag=1;
int ans=0,m;
for(int i=0;i<cnt&&pri[i]<=n;i++){
if(n%pri[i]==0){
m=0;
while(n%pri[i]==0){
n/=pri[i];
m++;
}
if(ans==0) ans=m;
else ans=gcd(ans,m);
if(ans==1) break;
}
}
if(n!=1) ans=1;
if(flag==-1&&!(ans&1)){
while(!(ans&1)){
ans>>=1;
}
}
printf("Case %d: %d\n", ++cas, ans);
}
return 0;
}