题目:洛谷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. POJ 3368 线段树

    思路: 先统计在第i个位置当前数字已经出现的次数. 维护两个数组,一个是当前位置的数字最后一次出现的位置,另一个是当前位置的数字第一次出现的位置 查找的时候分为两种情况: 没有和边界相交(意会意会)的 ...

  2. Visual Studio中C++工程的环境配置方法

    在Visual Studio的C++工程设置 1.添加工程的头文件目录:工程---属性---配置属性---c/c++---常规---附加包含目录. 2.添加文件引用的lib静态库路径:工程---属性- ...

  3. Node_进阶_6

    Node进阶第六天 一.复习 cookie是在res中设置,req中读取的.第一次的访问没有cookie. cookie的存储大小有限,kv对儿.对用户可见,用户可以禁用.清除cookie.可以被篡改 ...

  4. luogu P4062 [Code+#1]Yazid 的新生舞会(线段树+套路)

    今天原来是平安夜啊 感觉这题是道好题. 一个套路枚举权值\(x\),把权值等于\(x\)的设为1,不等于的设为-1,然后问题转化为多少个区间权值和大于. 发现并不是很好做,还有一个套路,用前缀和查分来 ...

  5. BZOJ 4472 [Jsoi2015]salesman(树形DP)

    4472: [Jsoi2015]salesman Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 417  Solved: 192[Submit][St ...

  6. Linux 和 Windows 双系统时间同步问题 修改注册表

    路径:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\TimeZoneInformation 1:新建  >> DWORD(32 b ...

  7. python_if_else,while,break

    #密码密文展示,getpass在pycharm中无法使用,只能在python中使用import getpass #登录判断'''raw_name="Monica"raw_passw ...

  8. 紫书 习题8-7 UVa 11925(构造法, 不需逆向)

    这道题的意思紫书上是错误的-- 难怪一开始我非常奇怪为什么第二个样例输出的是2, 按照紫书上的意思应该是22 然后就不管了,先写, 然后就WA了. 然后看了https://blog.csdn.net/ ...

  9. POJ——T1860 Currency Exchange

    http://poj.org/problem?id=1860 Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 29874   ...

  10. 洛谷 P3662 [USACO17FEB]Why Did the Cow Cross the Road II S

    P3662 [USACO17FEB]Why Did the Cow Cross the Road II S 题目描述 The long road through Farmer John's farm ...