UVA - 10622
Description Problem E: Perfect Pth PowersWe say that x is a perfect square if, for some integer b, x = b^2. Similarly, x is a perfect cube if, for some integer b, x = b^3. More generally, x is a perfect p th power if, for some integer b, x = b^p. Given an integer x you are to determine the largest p such that x is a perfect p thpower.Each test case is given by a line of input containing x. The value of x will have magnitude at least 2 and be within the range of a (32-bit) intin C, C++, and Java. A line containing 0 follows the last test case. For each test case, output a line giving the largest integer p such that x is a perfect pth power. Sample Input17 1073741824 25 0 Output for Sample Input1 30 2 G. V. Cormack Source
Root :: AOAPC II: Beginning Algorithm Contests (Second Edition) (Rujia Liu) :: Chapter 10. Maths ::
Exercises
Root :: Competitive Programming 3: The New Lower Bound of Programming Contests (Steven & Felix Halim) :: Mathematics :: Number Theory :: Working with Prime Factors Root :: AOAPC I: Beginning Algorithm Contests -- Training Guide (Rujia Liu) :: Chapter 2. Mathematics :: Number Theory :: Exercises: Beginner Root :: Prominent Problemsetters :: Gordon V. Cormack Root :: Competitive Programming 2: This increases the lower bound of Programming Contests. Again (Steven & Felix Halim) :: Mathematics :: Number Theory :: Working with Prime Factors |
对n分解质因数之后对每个质因数的指数求下gcd,需要注意n是负数的时候结果只能是奇数
#include <bits/stdc++.h>
#define foreach(it,v) for(__typeof((v).begin()) it = (v).begin(); it != (v).end(); ++it)
using namespace std;
typedef long long ll;
const int maxn = 1000000 + 5;
bool check[maxn];
const int SZ = 1<<20;
struct fastio{
char inbuf[SZ];
char outbuf[SZ];
fastio(){
setvbuf(stdin,inbuf,_IOFBF,SZ);
setvbuf(stdout,outbuf,_IOFBF,SZ);
}
}io;
int solve(ll n)
{
bool ng = false;
if(n<0) {
n = -n;
ng = true;
}
ll m = sqrt(n) + .5;
int gcd = 0;
for(ll i = 2; i <= m; i++) {
int cnt = 0;
while(n%i==0) {
cnt++;
n/=i;
}
gcd = __gcd(gcd,cnt);
}
if(ng) {
if(gcd&1)return gcd;
int res = 1;
for(int i = 1; i <= gcd; i += 2) {
if(gcd%i==0)res = i;
}
return res;
}
return max(gcd,1);
}
int main(int argc, char const *argv[])
{
ll n;
while(~scanf("%lld",&n)&&n) {
printf("%d\n", solve(n));
}
return 0;
}