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 }
时间: 2024-10-23 20:04:37

POJ 1730 Perfect Pth Powers(唯一分解定理)的相关文章

POJ 1730 Perfect Pth Powers (枚举||分解质因子)

Perfect Pth Powers Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 16638   Accepted: 3771 Description We say that x is a perfect square if, for some integer b, x = b2. Similarly, x is a perfect cube if, for some integer b, x = b3. More g

UVA 10622 - Perfect P-th Powers(数论)

UVA 10622 - Perfect P-th Powers 题目链接 题意:求n转化为b^p最大的p值 思路:对n分解质因子,然后取所有质因子个数的gcd就是答案,但是这题有个坑啊,就是输入的可以是负数,负数的情况比较特殊,p只能为奇数,这时候是要把答案不断除2除到为奇数即可. 代码: #include <stdio.h> #include <string.h> #include <math.h> long long n; int prime[333333], vi

uva10622 Perfect P-th Powers

留坑(p.343) 完全不知道哪里有问题qwq 从31向下开始枚举p,二分找存在性,或者数学函数什么的也兹辞啊 1 #include<cstdio> 2 #include<cstring> 3 #include<cstdlib> 4 #include<algorithm> 5 #include<iostream> 6 7 using namespace std; 8 9 void setIO(const string& s) { 10 f

UVA 10622 Perfect P-th Powers

https://vjudge.net/problem/UVA-10622 将n分解质因数,指数的gcd就是答案 如果n是负数,将答案除2至奇数 原理:(a*b)^p=a^p*b^p #include<cmath> #include<cstdio> #include<algorithm> #define N 65550 using namespace std; int gcd(int a,int b) { return !b ? a : gcd(b,a%b); } int

poj1730 - Perfect Pth Powers(完全平方数)(水题)

/* 以前做的一道水题,再做精度控制又出了错///... */ 题目大意: 求最大完全平方数,一个数b(不超过int范围),n=b^p,使得给定n,p最大: 题目给你一个数n,求p : 解题思路: 不需要遍历b,只需要从31开始遍历p就好了.这个方法涉及到我以前过分逃避的精度控制问题:本题会使用函数pow 而pow的返回值是double转化成int 会有损失,比如4的double表示可以使4.00000000或者3.99999999999:而我们使用 强制类型转换会截取整数部分结果就可能是3,因

UVa 10622 - Perfect P-th Powers(数论)

#include <algorithm> #include <iostream> #include <cstdlib> #include <cstring> #include <cstdio> #include <cmath> using namespace std; int find(int n) { for (int i = 2 ; i < 50000 ; ++ i) { if (pow(0.0+i, (int)(log10

poj 1730Perfect Pth Powers(分解质因数)

Perfect Pth Powers Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 16746   Accepted: 3799 Description We say that x is a perfect square if, for some integer b, x = b2. Similarly, x is a perfect cube if, for some integer b, x = b3. More g

POJ1730_Perfect Pth Powers【水题】

Perfect Pth Powers Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 16699 Accepted: 3786 Description We say that x is a perfect square if, for some integer b, x = b2. Similarly, x is a perfect cube if, for some integer b, x = b3. More gener

POJ 1845 - Sumdiv ( 数论 + 唯一分解定理 + 快速幂取模 )

POJ 1845 - Sumdiv ( 数论 + 唯一分解定理 + 快速幂取模 ) 这是一道数论的好题,需要较好的数学基础 题意: 给定A,B,求A^B的所有因数的和,再MOD 9901 分析: 这里用到了数论当中相当一部分知识 a. 唯一分解定理 任何一个整数都可以分解为若干个素数的幂的乘积的形式 A = ( p1 ^ q1 + p2 ^ q2 + ..... + pn ^ qn ) p为素数 A^B = ( p1 ^ (q1*B) + p2 ^ (q2*B) + ..... + pn ^ (