LightOJ-1220 Mysterious Bacteria (素数打表+欧几里得算法+唯一分解定理)给出x,求x=a^p,最大的指数
题目大意:
x = b^p, x只有一个因子的p次幂构成
如果24 = 2^3*3^1,p应该是gcd(3, 1) = 1,即24 = 24^1
324 = 3^4*2^2=(3^2*2)^2,p应该是gcd(4, 2) = 2,即324 = 18^2
所以p = gcd(x1, x2, x3, ... , xn){欧几里得算法求取最大公约数};
*本题有一个坑,就是x可能为负数,如果x为负数的话,x = b^q, q必须使奇数,所以将x转化为正数求得的解如果是偶数的话必须将其一直除2转化为奇数
题目:
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 xdays. 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 such that x is a perfect pth power.
Sample Input
3
17
1073741824
25
Sample Output
Case 1: 1
Case 2: 30
Case 3: 2
AC代码:
#include<iostream>
#include<string.h>
typedef long long ll;
#include<stdio.h>
using namespace std;
#define M 1000010
int dp[M];
int book[M];
int t,k;
ll m;
void dfs()
{k=0;memset(dp,0,sizeof(dp));memset(book,0,sizeof(book));for(int i=2; i<M; i++)/**因为任何一个整数都可以由一个素数经过乘法运算得到,故可通过素数打表的方式求得某数的唯一分解(得到幂次最大)*/if(!book[i]){dp[k++]=i;/*记录素数*/for(int j=2; i*j<M; j++)book[j*i]=1;}
}
int gcd(int a,int b)
{return !b?a:gcd(b,a%b);
}
int main()
{cin>>t;int tt=1;dfs();while(t--){int flag=0;cin>>m;if(m<0)/**本题的坑:m可能为负数*/{flag=1;m=-m;}int ans=0;for(int i=0;i<k&&dp[i]*dp[i]<=m;i++)/**care:remember停止条件为i<k&&dp[i]*dp[i]<=m,缺一不可*/{if(m%dp[i]==0){int a=0;while(m%dp[i]==0){m/=dp[i];/**唯一分解定理:直接对m的值进行操作,得到x=a1^b1*a2^b2.....an^bn*/a++;}if(ans=0)ans=a;elseans=gcd(ans,a);/**欧几里得算法:求得到的素数的幂次进行求取最大公约数操作*/}if(m==1)break;}if(m>1)/**则m为素数,因数只有1和自身*/ans=1;if(flag)/**填坑:若为负数,幂次不可能为偶数,故由最大公约数求出最大的奇数*/{while(ans%2==0)ans/=2;}printf("Case %d: %d\n",tt++,ans);}return 0;
}
LightOJ-1220 Mysterious Bacteria (素数打表+欧几里得算法+唯一分解定理)给出x,求x=a^p,最大的指数相关推荐
- LightOJ 1220 Mysterious Bacteria(唯一分解定理) (素数筛)
题干: 给你一个整数x,令x= b p b^p bp(b,p都为整数),求p的最大值. x为32位有符号整型. 思路: 首先,素数因为不能被除1和它自身外整除,所以x为素数时p=1: x为合数时,根据 ...
- LightOJ 1220 Mysterious Bacteria
题目链接:点我 Dr. Mob has just discovered a Deathly Bacteria. He named it RC-01. RC-01 has a very strange ...
- Aladdin and the Flying Carpet (素数打表+正整数的唯一分解定理,找因数对)
题目大意:给两个数a,b,求满足c*d==a且c>=b且d>=b的c,d二元组对数,(c,d)和(d,c)属于同一种情况 题目分析:根据唯一分解定理先将a唯一分解,则a的所有正约数的个数为 ...
- 类欧几里得算法详细推导过程(附带模板)
类欧几里得算法推导 初识 给出三种形式: f(a,b,c,n)=∑i=0n⌊ai+bc⌋f(a, b, c, n) = \sum_{i = 0} ^{n} \lfloor\frac{ai + b}{c ...
- 欧几里得算法和扩展欧几里得算法——杨子曰数学
欧几里得算法和扩展欧几里得算法--杨子曰数学 超链接:数学合集 不说废话,咱们直接开始 欧几里得算法 一句话: g c d ( a , b ) = g c d ( b , a m o d b ) gc ...
- 欧几里得算法与不定方程
本文主要介绍数论中的欧几里得算法,线性方程及它们之间的关系.本文主要参考了<数论概论>,因此将本文当成这本书的读书笔记也未尝不可. (本文正被完善中--) 欧几里得算法 问题:求60和22 ...
- LightOJ 1259 Goldbach`s Conjecture 素数打表
题目大意:求讲一个整数n分解为两个素数的方案数. 题目思路:素数打表,后遍历 1-n/2,寻找方案数,需要注意的是:C/C++中 bool类型占用一个字节,int类型占用4个字节,在素数打表中采用bo ...
- 【HDU/POJ/ZOJ】Calling Extraterrestrial Intelligence Again (素数打表模板)
http://poj.org/problem?id=1411 POJ http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=168 ...
- 筛法求素数 素数打表
c++ #include<cstdio> #include<cstring> #include<cmath>//素数打表 ,时间复杂度:O(nlog n) char ...
最新文章
- EasyRTMP手机直播推送rtmp流flash无法正常播放问题
- conda的导入导出
- Vue:echarts的柱状图为什么X轴上的文字不显示?
- OPPO平板智能眼镜终于开售!天玑版旗舰手机没有搭载自研芯片引热议
- 设置 myeclipse 编码格式
- 推荐一款Python开源库,技术人必备的造数据神器!
- kitkat-s5p4418drone 记录
- 信息学奥赛一本通(2070:【例2.13】数字对调)
- 重构职场竞争力之测试跨界思维
- 打开的文件过多问题排查思路及解决过程
- numpy 矩阵 秩_Python(NumPy):集合只能映射秩1数组
- 2021-02-26
- 树莓派——8、树莓派博通BCM2835芯片手册导读
- 引流产品用哪些比较合适?什么样的产品适合做引流?
- 查看树莓派I2C设备是否正常
- win10每次开机后,D、E、F盘就不见了,需要进入“磁盘管理”重新分配
- 从USB数据采集板看技术造诣
- HashSet-哈希值
- Error: Program type already present: android.support.design.widget.CoordinatorLayout$Behavior 预览器异常
- 如何锁自己的台式计算机,台式机键盘如何解锁