题目:洛谷P2293、BZOJ1213。

题目大意:给你$n,k(n\leq 10^{10000},k\leq 50)$,求$\lfloor \sqrt[k]{n}\rfloor$。

解题思路:高精度+二分+快速幂。

我压了九位。

这题真的卡的我丧心病狂啊!!开始无脑高精度,后来T的不知道哪去了。

首先高精度乘法中除法取模运算特别慢,要放在乘完后再处理。

还有最重要的优化:如果当前的答案的位数乘k减k+1大于n的位数,则不需要进行乘法,因为答案一定失败。

然后尽量减少传值,努力卡常即可。

可怜我压九位居然只输出八位,找了一小时错!

C++ Code:

%:pragma GCC optimize(2)
#include<cstring>
#include<cstdio>
using namespace std;
char READ[10200];
int k;
typedef unsigned long long ll;
struct BigInteger{
typedef unsigned long long ll;
static const ll base=1000000000;
ll v[1992];
int size;
BigInteger():size(0){
memset(v,0,sizeof v);
}
void print(){
printf("%llu",v[size]);
for(int i=size-1;i>0;--i)
printf("%09llu",v[i]);
putchar('\n');
}
void ch(const BigInteger& b){
BigInteger c;
for(int i=1;i<=size;++i)
for(int j=1;j<=b.size;++j)
c.v[i+j-1]+=(v[i]*b.v[j]);
c.size=size+b.size+2;
for(int i=1;i<=c.size;++i)
c.v[i+1]+=c.v[i]/base,c.v[i]%=base;
while(!c.v[c.size])--c.size;
*this=c;
}
BigInteger operator +(const BigInteger& b)const{
BigInteger c;
c.size=size;
if(size<b.size)c.size=b.size;
for(int i=1;i<=c.size;++i){
c.v[i]+=v[i]+b.v[i];
c.v[i+1]=c.v[i]/base;
c.v[i]%=base;
}
if(c.v[c.size+1])++c.size;
return c;
}
BigInteger inc(){
BigInteger c=*this;
c.v[1]++;
int now=1;
while(c.v[now]>=base){
c.v[now+1]++;
c.v[now++]-=base;
}
if(c.v[c.size+1])++c.size;
return c;
}
BigInteger dec(){
BigInteger c=*this;
c.v[1]--;
int now=1;
while(c.v[now]<0){
c.v[now+1]--;
c.v[now++]+=base;
}
if(!c.v[c.size])--c.size;
return c;
}
bool operator <=(const BigInteger& b)const{
if(size!=b.size)return size<b.size;
for(int i=size;i>0;--i)
if(v[i]!=b.v[i])return v[i]<b.v[i];
return true;
}
}a,l,r,mid,ans;
void read(){
scanf("%s",READ);
int len=strlen(READ);
a.size=0;
ll now=0,wid=1;
for(int i=len-1;i+1;--i){
now+=(READ[i]^'0')*wid;
wid*=10;
if(wid==1000000000){
wid=1;
a.v[++a.size]=now;
now=0;
}
}
if(now)a.v[++a.size]=now;
}
void average(){
for(int i=mid.size;i;--i){
mid.v[i-1]+=(mid.v[i]&1ll)*mid.base;
mid.v[i]>>=1;
}
mid.v[0]=0;
while(!mid.v[mid.size])--mid.size;
}
bool power(BigInteger a,int k){
BigInteger p;
p.size=p.v[1]=1;
while(k){
if(k&1)p.ch(a);
if(p.size>::a.size)return false;
a.ch(a);
k>>=1;
}
return p<=::a;
}
int main(){
scanf("%d",&k);
read();
if(k==1||a.size==0){
a.print();
return 0;
}
l.size=l.v[1]=1;
r=a;
while(l<=r){
mid=l+r;
average();
if(mid.size*k-k+1<=a.size&&power(mid,k))
l=(ans=mid).inc();else
r=mid.dec();
}
ans.print();
return 0;
}

[HNOI2004]高精度开根的更多相关文章

  1. BZOJ 1213: [HNOI2004]高精度开根

    二次联通门 : BZOJ 1213: [HNOI2004]高精度开根 正解 NTT+高精+倍增+二分 但是可以用python 2333333 m,n=int(raw_input()),int(raw_ ...

  2. Yroot of High-Precisions (luogu P2293 [HNOI2004]高精度开根)

    Background\text{Background}Background I've accepted\text{I've accepted}I've accepteda very good prob ...

  3. 【BZOJ1213】高精度开根

    python是坠吼的! 原题: 不贴原题,就是高精度开根,结果向下取整 首先二分答案,高精度嘛……python即可 二分右端点设为n会T掉,需要先倍增一个r,while(r **m <= n) ...

  4. BZOJ 高精度开根 JAVA代码

    晓华所在的工作组正在编写一套高精度科学计算的软件,一些简单的部分如高精度加减法.乘除法早已写完了,现在就剩下晓华所负责的部分:实数的高精度开m次根.因为一个有理数开根之后可能得到一个无理数,所以这项工 ...

  5. 洛谷 - P2293 - 高精度开根 - 高精度

    https://www.luogu.org/problemnew/show/P2293 要求求出给定高精度整数的非负根取整的结果. 还有神仙用Python的浮点pow运算骗到不少分的. 唉! 那么我们 ...

  6. [code3119]高精度练习之大整数开根

    试题描述  给出一个正整数n,求n开根号后的整数部分的值.n的位数不超过1000位. 输入 读入一个不超过1000位的正整数n. 输出 输出所求答案 输入示例 17   输出示例 4 高精度开根:需要 ...

  7. Java高精度基础+开根

    在焦作站的acm网络赛中遇到了一个高精度开根的水题--但是那时候WA了 后面学写java补题还T了orz 所以写一篇文章来记录一下java的大整数类型的基础和开根还有一点心得体会吧 首先给那一题的题面 ...

  8. codevs 3119 高精度练习之大整数开根 (各种高精+压位)

    /* codevs 3119 高精度练习之大整数开根 (各种高精+压位) 二分答案 然后高精判重 打了一个多小时..... 最后还超时了...压位就好了 测试点#1.in 结果:AC 内存使用量: 2 ...

  9. [BZOJ3211]花神游历各国(线段树+区间开根)

    题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=3211 分析: 区间开根是没法区间合并的. 但是注意到10^9开根开个5次就变成1了…… ...

随机推荐

  1. 整数翻转C++实现 java实现 leetcode系列(七)

    给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转. 示例 1: 输入: 123 输出: 321 示例 2: 输入: -123 输出: -321 示例 3: 输入: 120 输出: ...

  2. Glide错误java.lang.IllegalArgumentException: You cannot start a load for a destroyed activity

    解决办法 在使用Glide的那段代码加是否在主线程判断 if(Util.isOnMainThread()) { Glide.with(ClassifyItemDetailActivity.this). ...

  3. DF标志和串传送指令

    DF标志和串传送指令 flag的第10位是DF,方向标志位.在串处理指令中,控制si.di的递减. df = 0 每次操作后si.di递增 df = 1 每次操作后si.di递减 串传送指令 格式1: ...

  4. JOSN快速入门

    1.JSON介绍 (1)JSON是一种与开发语言无关的,轻量级的数据格式,全称 JavaScript Object  Notation,易于阅读和编写,语言解析和生产 (2)JSON数据类型表示 数据 ...

  5. 一个PHPer如何深入学习ES搜索引擎?

    公司早在一年前就上ES作为后端搜索服务的项目 ,我们PHPer只是负责实现业务接口,es的一些查询,优化技巧由另一组同事(JAVAer)负责,有时,一个需求过来,改动较大时,需要更改查询json语句, ...

  6. sqlserver 恢复模式及避免日志爆满的方法

    recovery simple 循环日志,空间自动回收,不可备份日志,恢复时仅能恢复到数据库备份时间点: 用于落地数据或测试环境或OLAP,不推荐用于生产OLTP 有时候distribution过大也 ...

  7. servlet中Session的用法

    ## (1)什么是Session? 服务器端为了保存用户的状态而创建的一个特殊的对象(即session对象).          当浏览器第一次访问服务器时,服务器会创建session对象(该    ...

  8. 解决IIS服务器部署 字体图标找不到的原因

    引言 我们往往在IIS上部署Web项目,或者发布Web项目的时候,经常会遇到浏览器找不到字体文件(woff/woff2)产生的错误.这样会导致浏览器无法加载字体图标,在影响加载时间的同时,更无法显示对 ...

  9. 基于 Token 的身份验证:JSON Web Token

    最近了解下基于 Token 的身份验证,跟大伙分享下.很多大型网站也都在用,比如 Facebook,Twitter,Google+,Github 等等,比起传统的身份验证方法,Token 扩展性更强, ...

  10. ajax同时提交表单且包含文件

    说明一下:FormData对象是html5的一个对象,目前的一些主流的浏览器都已经兼容.ie8暂时不支持,不支持FormData的,可以使用方法二,下面会介绍.接着说FormData,它是一个html ...