POJ - 2109 Power of Cryptography(高精度log+二分)
This problem involves the efficient computation of integer roots of numbers.
Given an integer n>=1 and an integer p>= 1 you have to write a program that determines the n th positive root of p. In this problem, given such integers n and p, p will always be of the form k to the n th. power, for an integer k (this integer is what your program must find).
Input
Output
Sample Input
- 2 16
- 3 27
- 7 4357186184021382204544
Sample Output
- 4
- 3
- 1234
题意:给出n和p(n<=200,p<=10^101),求方程k^n=p的k的正整数解,保证k<=10^9- 题解:这道神题传说有非常神奇的解f♂a
然而并没有什么卵用,你只会收到一连串的WA
该题的意图应该是贪心,至于怎么贪……わかない……
- 好吧,我太菜了,只能用最暴力的方法,设x^y=p
对于y>n的解来说,x必然小于k
对于y<n的解来说,x必然大于k
对于x来说单调性
所以可以二分
至于y该怎么求……想必一个高精度的log就行了!而且只需要保留个位即可
感觉我的代码还是有问题的,但莫名1A了
代码如下
- #include<cmath>
- #include<cstdio>
- #include<cstring>
- #include<iostream>
- #include<algorithm>
- using namespace std;
- struct big
- {
- int len;
- int num[];
- };
- int n;
- void trans(char* a,big &b)
- {
- memset(b.num,,sizeof(b.num));
- int len=strlen(a);
- for(int i=; i<len; i++)
- {
- b.num[len-i-]=a[i]-'';
- }
- b.len=len;
- }
- void trans_(int a,big &b)
- {
- memset(b.num,,sizeof(b.num));
- int len=;
- while(a)
- {
- b.num[len++]=a%;
- a/=;
- }
- b.len=len;
- }
- void print(big a)
- {
- for(int i=a.len-; i>=; i--)
- {
- printf("%d",a.num[i]);
- }
- puts("");
- }
- int comp(big x,big y)
- {
- if(x.len>y.len)
- {
- return ;
- }
- if(x.len<y.len)
- {
- return -;
- }
- for(int i=x.len-; i>=; i--)
- {
- if(x.num[i]>y.num[i])
- {
- return ;
- }
- if(x.num[i]<y.num[i])
- {
- return -;
- }
- }
- return ;
- }
- big sub(big a,big b)
- {
- big c;
- int len=a.len;
- int lenc=len;
- for(int i=; i<len; i++)
- {
- c.num[i]=a.num[i]-b.num[i];
- if(c.num[i]<)
- {
- c.num[i]+=;
- a.num[i+]--;
- }
- }
- while(c.num[lenc-]==&&lenc>)
- {
- lenc--;
- }
- c.len=lenc;
- return c;
- }
- void mul_ten(big &x)
- {
- int len=x.len;
- len++;
- for(int i=len-; i>=; i--)
- {
- x.num[i+]=x.num[i];
- }
- x.num[]=;
- while(x.num[len-]==&&len>)
- {
- len--;
- }
- x.len=len;
- }
- big div(big x,big y)
- {
- big f,m;
- memset(f.num,,sizeof(f.num));
- memset(m.num,,sizeof(m.num));
- m.len=;
- int len=x.len;
- for(int i=x.len-; i>=; i--)
- {
- mul_ten(m);
- m.num[]=x.num[i];
- while(comp(m,y)!=-)
- {
- m=sub(m,y);
- f.num[i]++;
- }
- }
- while(f.num[len-]==&&len>)
- {
- len--;
- }
- f.len=len;
- return f;
- }
- int check(big x,big y)
- {
- big z;
- int cnt=;
- z.len=;
- z.num[]=;
- while(!comp(x,z)==)
- {
- if(comp(x,y)==-)
- {
- break;
- }
- cnt++;
- x=div(x,y);
- }
- if(cnt<n)
- {
- return ;
- }
- else
- {
- return ;
- }
- }
- int main()
- {
- char b[];
- int a;
- big x,y;
- while(scanf("%d %s",&n,b)==)
- {
- memset(x.num,,sizeof(x.num));
- memset(y.num,,sizeof(y.num));
- int l=,r=;
- int mid;
- trans(b,y);
- while(l<r)
- {
- mid=(l+r)>>;
- trans_(mid,x);
- int flag=check(y,x);
- if(flag)
- {
- l=mid;
- }
- else
- {
- r=mid-;
- }
- if(r-l<=)
- {
- trans_(r,x);
- if(check(y,x))
- {
- printf("%d\n",r);
- break;
- }
- else
- {
- printf("%d\n",l);
- break;
- }
- }
- }
- }
- }
POJ - 2109 Power of Cryptography(高精度log+二分)的更多相关文章
- 贪心 POJ 2109 Power of Cryptography
题目地址:http://poj.org/problem?id=2109 /* 题意:k ^ n = p,求k 1. double + pow:因为double装得下p,k = pow (p, 1 / ...
- POJ 2109 -- Power of Cryptography
Power of Cryptography Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 26622 Accepted: ...
- POJ 2109 Power of Cryptography 数学题 double和float精度和范围
Power of Cryptography Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 21354 Accepted: 107 ...
- poj 2109 Power of Cryptography
点击打开链接 Power of Cryptography Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 16388 Ac ...
- POJ 2109 Power of Cryptography【高精度+二分 Or double水过~~】
题目链接: http://poj.org/problem?id=2109 参考: http://blog.csdn.net/code_pang/article/details/8263971 题意: ...
- POJ 2109 Power of Cryptography 大数,二分,泰勒定理 难度:2
import java.math.BigInteger; import java.util.Scanner; public class Main { static BigInteger p,l,r,d ...
- poj 2109 Power of Cryptography (double 精度)
题目:http://poj.org/problem?id=2109 题意:求一个整数k,使得k满足kn=p. 思路:exp()用来计算以e为底的x次方值,即ex值,然后将结果返回.log是自然对数,就 ...
- Poj 2109 / OpenJudge 2109 Power of Cryptography
1.Link: http://poj.org/problem?id=2109 http://bailian.openjudge.cn/practice/2109/ 2.Content: Power o ...
- POJ-2109 Power of Cryptography(数学或二分+高精度)
题目链接: https://vjudge.net/problem/POJ-2109 题目大意: 有指数函数 k^n = p , 其中k.n.p均为整数且 1<=k<=10^9 , 1< ...
随机推荐
- 你知道PORT吗?
在TCP协议中,有端口(PORT)的概念,很多人都不知道端口到底是什么.之前介绍过物理地址,也就是网卡地址,做个不恰当的比喻,物理地址(MAC)地址,相当于身份证(唯一),家庭地址是几幢几单元相当于I ...
- Studio 3T 如何使用 Query Builder 查询数据
Studio 3T 是一款对 MongoDB 进行数据操作的可视化工具. 在 Studio 3T 中,我们可以借助 Query Builder 的 Drag & Drop 来构建查询条件. 具 ...
- 【转】JMeter基础之——一个简单的性能测试
上一节中,我们了解了jmeter的一此主要元件,那么这些元件如何使用到性能测试中呢.这一节创建一个简单的测试计划来使用这些元件.该计划对应的测试需求. 1)测试目标网站是fnng.cnblogs.co ...
- Effective java笔记3--类和接口1
一.使类和成员的可访问能力最小化 要想区别一个设计良好的模块与一个设计不好的模块,最重要的因素是,这个模块对于外部的其他模块而言,是否隐藏了内部的数据和其他的实现细节.一个设计良好的模块会隐藏所有的实 ...
- Python web框架 flask
Flask是一个基于Python开发并且依赖jinja2模板和Werkzeug WSGI服务的一个微型框架,对于Werkzeug本质是Socket服务端,其用于接收http请求并对请求进行预处理,然后 ...
- get与post两种方式的优缺点
get: get是从服务器上获取数据,post是向服务器传送数据: get传送的数据量较小,不能大于2KB.post传送的数据量较大,一般被默认为不受限制.但理论上,IIS4中最大量为80KB,IIS ...
- DataTable改变column类型
1.必须先克隆DataTable 2.列换类型 3.逐行往新DataTable赋值,并转换某列类型 如: DataTable dt = diorg.Clone(); //必须先克隆,此时并不包含数据 ...
- Maven整合SSM框架——详细整合教程(Spring+SpringMVC+MyBatis)
使用SSM(Spring.SpringMVC和Mybatis)已经有三个多月了,项目在技术上已经没有什么难点了,基于现有的技术就可以实现想要的功能,当然肯定有很多可以改进的地方.之前没有记录SSM整合 ...
- MySQL备份还原之一mydumper
1)源码编译安装 1.下载 mydumper源码 2.解压 [mysql@localhost ~]$ tar -xvf mydumper-0.9.1.tar mydumper-0.9.1/CMakeL ...
- Python基础学习六 操作Redis
import redis r = redis.Redis(host=',db=1) #set get delete setex 都是针对string类型的 k-v # r.set('louis_ses ...