[HNOI2004]高精度开根
题目:洛谷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]高精度开根的更多相关文章
- BZOJ 1213: [HNOI2004]高精度开根
二次联通门 : BZOJ 1213: [HNOI2004]高精度开根 正解 NTT+高精+倍增+二分 但是可以用python 2333333 m,n=int(raw_input()),int(raw_ ...
- Yroot of High-Precisions (luogu P2293 [HNOI2004]高精度开根)
Background\text{Background}Background I've accepted\text{I've accepted}I've accepteda very good prob ...
- 【BZOJ1213】高精度开根
python是坠吼的! 原题: 不贴原题,就是高精度开根,结果向下取整 首先二分答案,高精度嘛……python即可 二分右端点设为n会T掉,需要先倍增一个r,while(r **m <= n) ...
- BZOJ 高精度开根 JAVA代码
晓华所在的工作组正在编写一套高精度科学计算的软件,一些简单的部分如高精度加减法.乘除法早已写完了,现在就剩下晓华所负责的部分:实数的高精度开m次根.因为一个有理数开根之后可能得到一个无理数,所以这项工 ...
- 洛谷 - P2293 - 高精度开根 - 高精度
https://www.luogu.org/problemnew/show/P2293 要求求出给定高精度整数的非负根取整的结果. 还有神仙用Python的浮点pow运算骗到不少分的. 唉! 那么我们 ...
- [code3119]高精度练习之大整数开根
试题描述 给出一个正整数n,求n开根号后的整数部分的值.n的位数不超过1000位. 输入 读入一个不超过1000位的正整数n. 输出 输出所求答案 输入示例 17 输出示例 4 高精度开根:需要 ...
- Java高精度基础+开根
在焦作站的acm网络赛中遇到了一个高精度开根的水题--但是那时候WA了 后面学写java补题还T了orz 所以写一篇文章来记录一下java的大整数类型的基础和开根还有一点心得体会吧 首先给那一题的题面 ...
- codevs 3119 高精度练习之大整数开根 (各种高精+压位)
/* codevs 3119 高精度练习之大整数开根 (各种高精+压位) 二分答案 然后高精判重 打了一个多小时..... 最后还超时了...压位就好了 测试点#1.in 结果:AC 内存使用量: 2 ...
- [BZOJ3211]花神游历各国(线段树+区间开根)
题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=3211 分析: 区间开根是没法区间合并的. 但是注意到10^9开根开个5次就变成1了…… ...
随机推荐
- (转载) Android开发时,那些相见恨晚的工具或网站!
huangmindong的专栏 目录视图 摘要视图 订阅 赠书 | 异步2周年,技术图书免费选 程序员8月书讯 项目管理+代码托管+文档协作,开发更流畅 Android ...
- <%=%>、<%%>、<%@%>、<%#%>的区别
1.<%= %> 里面放变量名,获取后台的变量值,直接输入变量到页面上,里面放的变量名,未经过encode eg: 后台: seession["ab"]=ab; 前台: ...
- <ItemTemp>里写判断语句
<%@ Language="C#" %> <html> <head></head> <body> <%=DateT ...
- jquery定时器
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/ ...
- swift语言点评三 - Basic Operators
1.Tuples are compared from left to right, one value at a time, until the comparison finds two values ...
- HYSBZ-1040 骑士 基环树上的树状dp
题目链接:https://cn.vjudge.net/problem/HYSBZ-1040 题意 Z国的骑士团是一个很有势力的组织,帮会中汇聚了来自各地的精英. 他们劫富济贫,惩恶扬善,受到社会各界的 ...
- HDU-2204- Eddy’s爱好 (容斥原理)
题意 给出一个数n,问1-n中有多少个数可以表示为m^k,m,k均为正整数且k>1 (1<=n<=1^18) 题解 (一开始^以为是异或懵逼了好久....) 额,显然1这个数比较讨厌 ...
- cobbler Ubuntu16.04 安装
cobbler vim /etc/debmirror.conf sed -i 's/@dists=\"sid\";/#@dists=\"sid\";/ ...
- virtualbox挂载目录失败mount: unknown filesystem type ‘vboxsf’
转自[https://blog.csdn.net/u011486871/article/details/79443375] [有小修改] 错误提示:Vagrant was unable to moun ...
- python 模块一览
一个模块可以对应一个文件 同一个模块,可以import多次,但只会被导入一次 模块的导入顺序 导入模块写在文件最上面 自己写的和内置的以及扩展的分开 顺序:内置,扩展,自己写的 按字母大小写排序 一行 ...