首页 > 代码库 > POJ 1730 Perfect Pth Powers(唯一分解定理)

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\n", ans);71     }72 }

 

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