题意:
给一个x,问让它被表示成b^p(b的p次方)。p最大是多少。
思路:
将x分解,得到质因子以及个数。
最大其实就是这些质因子个数的最大公约数。
然后要注意这题输入的x可能是负数。
负数的话要去掉2的约数。
代码:
// http://blog.csdn.net/wdcjdtc/article/details/44653913
#include <algorithm>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
typedef long long ll;
const int N = 1e6 + 100;
int num = 0;
ll prime[ N ];
bool isPrime[ N ];
void init () {
memset ( isPrime, true, sizeof ( isPrime ) );
isPrime[ 0 ] = isPrime[ 1 ] = false;
for ( int i = 2; i < N; ++i ) {
if ( isPrime[ i ] ) {
prime[ num++ ] = i;
for ( int j = i + i; j < N; j += i )
isPrime[ j ] = false;
}
}
}
int gcd ( int a, int b ) { return b == 0 ? a : gcd ( b, a % b ); }
int main () {
init ();
int T;
scanf ( "%d", &T );
for ( int ks = 1; ks <= T; ++ks ) {
ll n;
scanf ( "%lld", &n );
int flag = 0;
if ( n < 0 )
n = -n, flag = 1;
//唯一分解
ll ans = 0;
for ( int i = 0; i < num && prime[ i ] * prime[ i ] <= n; ++i ) {
ll cnt = 0;
while ( n % prime[ i ] == 0 )
++cnt, n /= prime[ i ];
//取最大公因数
ans = ( ans == 0 ? cnt : gcd ( ans, cnt ) );
}
//素数,没有其它因子
if ( n > 1 )
ans = 1;
//负数,不能是偶数次幂
if ( flag )
while ( ans % 2 == 0 )
ans /= 2;
printf ( "Case %d: %lld\n", ks, ans );
}
return 0;
}