Mysterious Bacteria
LightOJ - 1220Dr. Mob has just discovered a Deathly Bacteria. He named it RC-01. RC-01 has a very strange reproduction system. RC-01 lives exactly x days. Now RC-01 produces exactly p new deadly Bacteria where x = bp (where b, p are integers). More generally, x is a perfect pth power. Given the lifetime x of a mother RC-01 you are to determine the maximum number of new RC-01 which can be produced by the mother RC-01.
Input
Input starts with an integer T (≤ 50), denoting the number of test cases.
Each case starts with a line containing an integer x. You can assume that x will have magnitude at least 2 and be within the range of a 32 bit signed integer.
OutputFor each case, print the case number and the largest integer p such that x is a perfect pth power.
Sample Input3
17
1073741824
25
Sample OutputCase 1: 1
Case 2: 30
Case 3: 2
给你一个数x = b^p,求p的最大值
x = p1^x1*p2^x2*p3^x3*...*ps^xs
x = b^p, x只有一个因子的p次幂构成如果x = 12 = 2^2*3^1,要让x = b^p,及12应该是12 = 12^1
所以p = gcd(x1, x2, x3, ... , xs);
比如:24 = 2^3*3^1,p应该是gcd(3, 1) = 1,即24 = 24^1
324 = 3^4*2^2,p应该是gcd(4, 2) = 2,即324 = 18^2
本题有好多个坑,就是x可能为负数,如果x为负数的话,x = b^q, q必须使奇数,所以将x转化为正数求得的解如果是偶数的话必须将其一直除2转化为奇数,其次是虽然它给定n<2^32但是不能用int需要用long long才能过,我估计还是负数那里出的问题
code:
#include <iostream> #include <cstdio> #include <cstring> using namespace std; const int maxn = 1e5+10; bool isprime[maxn]; int prime[maxn]; int top; void init(){ memset(isprime,true,sizeof(isprime)); isprime[0] = isprime[1] = false; top = 0; for(int i = 2; i < maxn; i++){ if(isprime[i]){ prime[top++] = i; for(int j = i+i; j < maxn; j += i){ isprime[j] = false; } } } } int gcd(int a,int b){ if(b == 0) return a; else return gcd(b,a%b); } int main(){ init(); int t,cas = 0; scanf("%d",&t); while(t--){ long long n; int flag = 0; int ans = 0; scanf("%lld",&n); if(n < 0){ flag = 1; n = -n; } for(int i = 0; prime[i] * prime[i] <= n && i < top; i++){ if(n % prime[i] == 0){ int cnt = 0; while(n % prime[i] == 0){ cnt++; n /= prime[i]; } ans = gcd(ans,cnt); } if(n == 1) break; } if(n != 1) ans = gcd(ans,1); if(flag){ while(ans % 2 == 0) ans /= 2; } printf("Case %d: %d\n",++cas,ans); } return 0; }