题目:洛谷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 设计一个菱形形状的Imageview组件.

    网上没有资料,特来请教下大神 Android 设计一个菱形形状的Imageview组件. >> android这个答案描述的挺清楚的:http://www.goodpm.net/postr ...

  2. [SDOI2008]沙拉公主的困惑 线性筛_欧拉函数_逆元_快速幂

    Code: #include<cstdio> using namespace std; typedef long long ll; const int maxn=10000000+1; l ...

  3. 洛谷P2617 Dynamic Rankings 主席树 单点修改 区间查询第 K 大

    我们将线段树套在树状数组上,查询前预处理出所有要一起移动的节点编号,并在查询过程中一起将这些节点移到左右子树上. Code: #include<cstdio> #include<cs ...

  4. 服务器搭建域控与SQL Server的AlwaysOn环境过程(二) 搭建客户端节点 服务器

    1. 修改客户端服务器的计算机名,重启后,如果服务器属于克隆服务器,需要修改服务器SID,如果没有则调过这一步. 命令行方式:启动Windows2008进入系统后,打开“CMD窗口”并进入到" ...

  5. 滴滴云安装mysql数据库

    Linux CentOS安装配置MySQL数据库   没什么好说的,直接正面刚吧. 安装mysql数据库 a)下载mysql源安装包:wget http://dev.mysql.com/get/mys ...

  6. php对excel导入导出的支持

    闲话不多说了,大家直接进入主题 php对excel的导入:  1.为程序添加一个form表单,为form标签添加“enctype="multipart/form-data"”属性 ...

  7. dede内链怎么优化,Dedecms内部链接优化技巧

    dede内链怎么优化,dedecms内部链接优化技巧 使用dedecms的过程中发现,可以通过dedecms的文档关键词维护功能.发表文章时候的关键词添加功能(也可以自动获取)以及核心设置里面的是否使 ...

  8. Manacher 求最长回文子串算法

    Manacher算法,是由一个叫Manacher的人在1975年发明的,可以在$O(n)$的时间复杂度里求出一个字符串中的最长回文子串. 例如这两个回文串“level”.“noon”,Manacher ...

  9. (52)KeyError错误

    当出现:22KeyError: 'xxxxxx'这样的错误,可以肯定依赖出问题了,一般是你引用某个字段,但没有定义,又没有指定依赖的模块,最后找不到对应字段 解决方法:开发工具,把 xxxxxx 去搜 ...

  10. nginx proxy_set_header设置,自定义header

    在实际应用中,我们可能需要获取用户的ip地址,比如做异地登陆的判断,或者统计ip访问次数等,通常情况下我们使用request.getRemoteAddr()就可以获取到客户端ip,但是当我们使用了ng ...