题目:洛谷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. (转载) Android开发时,那些相见恨晚的工具或网站!

    huangmindong的专栏       目录视图 摘要视图 订阅 赠书 | 异步2周年,技术图书免费选      程序员8月书讯      项目管理+代码托管+文档协作,开发更流畅 Android ...

  2. <%=%>、<%%>、<%@%>、<%#%>的区别

    1.<%= %> 里面放变量名,获取后台的变量值,直接输入变量到页面上,里面放的变量名,未经过encode eg: 后台: seession["ab"]=ab; 前台: ...

  3. <ItemTemp>里写判断语句

    <%@ Language="C#" %> <html> <head></head> <body> <%=DateT ...

  4. jquery定时器

    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/ ...

  5. swift语言点评三 - Basic Operators

    1.Tuples are compared from left to right, one value at a time, until the comparison finds two values ...

  6. HYSBZ-1040 骑士 基环树上的树状dp

    题目链接:https://cn.vjudge.net/problem/HYSBZ-1040 题意 Z国的骑士团是一个很有势力的组织,帮会中汇聚了来自各地的精英. 他们劫富济贫,惩恶扬善,受到社会各界的 ...

  7. HDU-2204- Eddy’s爱好 (容斥原理)

    题意 给出一个数n,问1-n中有多少个数可以表示为m^k,m,k均为正整数且k>1 (1<=n<=1^18) 题解 (一开始^以为是异或懵逼了好久....) 额,显然1这个数比较讨厌 ...

  8. cobbler Ubuntu16.04 安装

    cobbler vim /etc/debmirror.conf      sed -i 's/@dists=\"sid\";/#@dists=\"sid\";/ ...

  9. virtualbox挂载目录失败mount: unknown filesystem type ‘vboxsf’

    转自[https://blog.csdn.net/u011486871/article/details/79443375] [有小修改] 错误提示:Vagrant was unable to moun ...

  10. python 模块一览

    一个模块可以对应一个文件 同一个模块,可以import多次,但只会被导入一次 模块的导入顺序 导入模块写在文件最上面 自己写的和内置的以及扩展的分开 顺序:内置,扩展,自己写的 按字母大小写排序 一行 ...