Mysterious Bacteria (唯一分解定律)
Dr. 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.
Output
For each case, print the case number and the largest integer p
Sample Input
3
17
1073741824
25
Sample Output
Case 1: 1
Case 2: 30
Case 3: 2
分析:
n = p1^x1 * p2^x2 * p3^x3 ……
故找到 gcd(x1,x2,x3……)即可;
特別注意n為負,即只能為次冪!
#include <iostream> #include <cstdio> #include <cstring> using namespace std; typedef long long ll; const int maxn = 1e6+5; int prime[maxn],cnt = 0; bool vis[maxn]; void is_prime() { memset(prime,0,sizeof prime); memset(vis,0,sizeof vis); for(int i = 2; i < maxn; i++) { if(!vis[i]) { prime[cnt++] = i; for(int j = 2*i; j < maxn; j += i) vis[j] = 1; } } } int gcd(int a,int b) { if(a%b == 0) return b; return gcd(b,a%b); } int main() { is_prime(); int T,Case = 1; scanf("%d",&T); while(T--) { ll n; scanf("%lld",&n); bool judge = true; if(n < 0) { n = -n; judge = false; } int sum = 0; for(int i = 0; i < cnt && prime[i]*prime[i] <= n; i++) { if(n%prime[i] == 0) { int cou = 0; while(n%prime[i] == 0) { cou++; n /= prime[i]; } if(sum == 0) //湊到冪一樣就行了 sum = cou; else sum = gcd(sum,cou); } } if(n > 1) sum = gcd(sum,1); if(!judge) while(sum%2 == 0) sum /= 2; printf("Case %d: %d\n",Case++,sum); } return 0; }