题目链接:http://vjudge.net/contest/138024#problem/J
题目大意:求满足x=b^p 的最大的p的值。
解题思路:根据唯一分解定理先分解x,然后暴力枚举它的素因子,判断是否符合条件。注意x为负数的情况。当x为负数时,则p只能是奇数。
AC代码:
#include<stdio.h>
#include<algorithm>
#include<string.h>
#include<iostream>
#include<math.h>
typedef long long LL;
#define mann 105
using namespace std;
struct node
{
int num,count;
} p[60];
int k;
void judge(int n)//唯一分解定理
{
k=0;
for(LL i=2; i*i<=n; i++)
{
if(n%i==0)
{
int cnt=0;
p[k].num=i;//记录素数
while(n%i==0)
{
n/=i;
cnt++;
}
p[k].count=cnt;//记录素数出现的次数
k++;
}
}
if(n>1)
{
p[k].num=n;
p[k].count=1;
k++;
}
}
bool judge2(int x)
{
for(int i=0; i<k; i++)
{
if(p[i].count%x)//如果是a^n的形式,则n%x==0,否则就不是;
return false;
}
return true;
}
int main()
{
int t,n,T=0;
scanf("%d",&t);
while(t--)
{
cin>>n;
int flag=0;
if(n<0)//判断正负,如果为负数,则只能是奇数次幂
{
n=-n;
flag=1;
}
judge(n);
int ans;
if(flag)
{
for(int i=32; i>0; i--)
{
if(judge2(i)&&i&1)
{
ans=i;
break;
}
}
}
else
{
for(int i=32; i>0; i--)
{
if(judge2(i))
{
ans=i;
break;
}
}
}
printf("Case %d: %d\n",++T,ans);
}
return 0;
}