POJ 1730 Perfect Pth Powers(唯一分解定理)

http://poj.org/problem?id=1730

题意:
给出一个n,a=b^p,求出最大p值。

思路:

首先利用唯一分解定理,把n写成若干个素数相乘的形势。接下来对于每个指数求最大公约数,该公约数就是所能到达的最大p值。

有一点要注意的是如果n为负数的话,如果当前p值为偶数,就一直除2直到p为奇数。

 1 #include<iostream>
 2 #include<algorithm>
 3 #include<string>
 4 #include<cstring>
 5 #include<cmath>
 6 using namespace std;
 7 
 8 const int maxn = 70000;
 9 
10 long long n;
11 int vis[maxn];
12 int prime[7000];
13 int cnt;
14 
15 void get_prime()
16 {
17     cnt = 0;
18     int m = sqrt(maxn + 0.5);
19     for (int i = 2; i < maxn; i++)
20     {
21         if (!vis[i])
22         {
23             prime[cnt++] = i;
24             for (int j = i; j < maxn; j += i)
25                 vis[j] = 1;
26         }
27     }
28 }
29 
30 
31 int gcd(int a, int b)
32 {
33     if (a < b) return gcd(b, a);
34     if (b == 0) return a;
35     return gcd(b, a % b);
36 }
37 
38 int main()
39 {
40     //freopen("D:\txt.txt", "r", stdin);
41     get_prime();
42     while (~scanf("%lld", &n) && n)
43     {
44         int flag = 0;
45         int ans = 0;
46         if (n < 0)
47         {
48             n = -n;
49             flag = 1;
50         }
51         int flag2 = 1;
52         for (int i = 0; i < cnt && n>1; i++)
53         {
54             if (n%prime[i] == 0)
55             {
56                 int ret = 0;
57                 while (n%prime[i] == 0)
58                 {
59                     n /= prime[i];
60                     ret++;
61                 }
62                 ans = gcd(ans, ret);
63             }
64         }
65         if (n > 1)  ans = 1;
66         if (flag)
67         {
68             while (ans % 2 == 0)  ans /= 2;
69         }
70         printf("%d
", ans);
71     }
72 }
原文地址:https://www.cnblogs.com/zyb993963526/p/6575583.html