1. /*
  2. codevs 3119 高精度练习之大整数开根 (各种高精+压位)
  3. 二分答案 然后高精判重 打了一个多小时.....
  4. 最后还超时了...压位就好了
  5. 测试点#1.in 结果:AC 内存使用量: 256kB 时间使用量: 0ms
  6. 测试点#2.in 结果:AC 内存使用量: 256kB 时间使用量: 1ms
  7. 测试点#3.in 结果:AC 内存使用量: 256kB 时间使用量: 0ms
  8. 测试点#4.in 结果:AC 内存使用量: 256kB 时间使用量: 10ms
  9. 测试点#5.in 结果:AC 内存使用量: 256kB 时间使用量: 56ms
  10. */
  11. #include<cstdio>
  12. #include<cstring>
  13. #include<cmath>
  14. #define maxn 1010
  15. #define ll long long
  16. #define bas 100000000
  17. #define mem(a,b) for(ll i=0;i<=len;i++)a[i]=b[i];
  18. #define mes(a) for(ll i=0;i<=len;i++)a[i]=0;
  19. using namespace std;
  20. ll len,a[maxn],l[maxn],r[maxn],mid[maxn],ans[maxn],x[maxn];
  21. char s[maxn];
  22. ll max(ll x,ll y){
  23. return x>y?x:y;
  24. }
  25. void plu(ll a[maxn],ll b[maxn]){
  26. ll c[maxn];mes(c);
  27. c[]=max(a[],b[]);
  28. for(int i=;i<=c[];i++){
  29. c[i]+=a[i]+b[i];
  30. if(c[i]>=bas){
  31. c[i+]++;c[i]%=bas;
  32. }
  33. }
  34. if(c[c[]+])c[]++;
  35. mem(mid,c);
  36. }
  37. void Plu(ll a[maxn],ll b){
  38. ll p=,c[maxn];mes(c);
  39. mem(c,a);c[p]++;
  40. while(c[p]>=bas){
  41. c[p]%=bas;c[p+]++;p++;
  42. }
  43. if(c[c[]+])c[]++;
  44. mem(l,c);
  45. }
  46. void miu(ll a[maxn],ll b){
  47. ll p=,c[maxn];mes(c);
  48. mem(c,a);c[p]--;
  49. while(c[p]<){
  50. c[p]+=bas;c[p+]--;p++;
  51. }
  52. if(c[c[]]==)c[]--;
  53. mem(r,c);
  54. }
  55. void mul(ll a[maxn],ll b[maxn],ll c[maxn]){
  56. for(int i=;i<=a[];i++){
  57. for(int j=;j<=b[];j++){
  58. c[i+j-]+=a[i]*b[j];
  59. if(c[i+j-]>=bas){
  60. c[i+j]+=c[i+j-]/bas;
  61. c[i+j-]%=bas;
  62. }
  63. }
  64. ll len=i+b[];
  65. while(c[len]>=bas){
  66. c[len+]+=c[len]/bas;
  67. c[len]%=bas;len++;
  68. }
  69. }
  70. for(int i=a[]+b[];i>=;i--)
  71. if(c[i]){
  72. c[]=i;break;
  73. }
  74. }
  75. void div(ll a[maxn],ll b){
  76. ll c[maxn];mes(c);
  77. for(int i=a[];i>=;i--){
  78. c[i]=a[i+]%b*bas+a[i];
  79. c[i]=c[i]/b;
  80. }
  81. for(int i=a[];i>=;i--)
  82. if(c[i]){
  83. c[]=i;break;
  84. }
  85. mem(a,c);
  86. }
  87. bool cmp(ll a[maxn],ll b[maxn]){
  88. if(a[]>b[])return ;
  89. if(a[]<b[])return ;
  90. for(ll i=a[];i>=;i--){
  91. if(a[i]>b[i])return ;
  92. if(a[i]<b[i])return ;
  93. }
  94. return ;
  95. }
  96. bool Judge(){
  97. memset(x,,sizeof(x));
  98. mul(mid,mid,x);
  99. return cmp(x,a);
  100. }
  101. int main()
  102. {
  103. scanf("%s",s);
  104. a[]=strlen(s);len=a[];
  105. for(int i=;i<=a[];i++)
  106. a[i]=s[a[]-i]-'';
  107. for(int i=;i<=len;i+=)
  108. x[++x[]]=a[i+]*+a[i+]*+a[i+]*+
  109. a[i+]*+a[i+]*+a[i+]*+a[i+]*+a[i];
  110. mem(a,x);
  111. mem(r,a);r[]=a[]/+;
  112. while(cmp(l,r)){
  113. plu(l,r);
  114. div(mid,);
  115. if(Judge()){
  116. mem(ans,mid);
  117. Plu(mid,);
  118. }
  119. else miu(mid,);
  120. }
  121. printf("%lld",ans[ans[]]);
  122. for(ll i=ans[]-;i>=;i--)
  123. printf("%08lld",ans[i]);
  124. return ;
  125. }

codevs 3119 高精度练习之大整数开根 (各种高精+压位)的更多相关文章

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

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

  2. codevs 3123 高精度练习之超大整数乘法

    fft. #include<iostream> #include<cstdio> #include<cstring> #include<complex> ...

  3. 大整数类BIGN的设计与实现 C++高精度模板

    首先感谢刘汝佳所著的<算法竞赛入门经典>. 众所周知,C++中储存能力最大的unsigned long long 也是有着一个上限,如果我们想计算非常大的整数时,就不知所措了,所以,我写了 ...

  4. Ural 1158. Censored! 有限状态自动机+DP+大整数

    Ural1158 看上去很困难的一道题. 原文地址 http://blog.csdn.net/prolightsfxjh/article/details/54729646 题意:给出n个不同的字符,用 ...

  5. COJ 1211 大整数开平方

    手写求大整数开根号所得到的值,具体计算过程参考别人的资料,最后利用java的大整数得到答案 别人博客链接:http://www.cnblogs.com/Rinyo/archive/2012/12/16 ...

  6. 原生js数值开根算法

    不借助Math函数求开根值 1.二分迭代法求n开根后的值 思路: left=0 right=n mid=(left+right)/2 比较mid^2与n大小 =输出: >改变范围,right=m ...

  7. POJ 1001 解题报告 高精度大整数乘法模版

    题目是POJ1001 Exponentiation  虽然是小数的幂 最终还是转化为大整数的乘法 这道题要考虑的边界情况比较多 做这道题的时候,我分析了 网上的两个解题报告,发现都有错误,说明OJ对于 ...

  8. BZOJ 高精度开根 JAVA代码

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

  9. Java高精度基础+开根

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

随机推荐

  1. List Of All Machine Learning Sorted By Citation

    List Of All Machine Learning Sorted By Citation With > 300 citations 2013-10-10 See Citation Anal ...

  2. js中常用framesetiframe页面跳转传参方法实例大全

    logf的空间

  3. 关于C51内的code,idata,xdata

    从数据存储类型来说,8051系列有片内.片外程序存储器,片内.片外数据存储器,片内程序存储器还分直接寻址区和间接寻址类型,分别对应code.data.xdata.idata以及根据51系列特点而设定的 ...

  4. Delphi_OD_代码_调试_Delphi反调试技术(以OD为例附核心原代码)

    1.程序窗口[chuang kou]句柄[ju bing]检测原理:用FindWindow函数[han shu]查找[cha zhao]具有相同窗口[chuang kou]类名和标题的窗口[chuan ...

  5. Android AlertDialog更改标题颜色,字体等

    更改AlertDialog标题的方法google目前没有提供,只能通过其他办法 一种办法是:首先在源代码中找到有个叫AlertController的类,这个类就是AlertDialog的实现类,是没有 ...

  6. 【HDOJ】1466 计算直线的交点数

    找了个规律. #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAXN 21 ...

  7. java学习面向对象之内部类

    什么是面向对象内部类呢?所谓的内部类,即从字面意义上来理解的话,就是把类放到类当中. 那么内部类都有什么特点呢? 1.内部类可以访问包裹他的类的成员. 2.如果包裹他的类想访问被其包裹的类的话就得实例 ...

  8. 常见的Robotium测试的问题总结:

    常见的Robotium测试的问题总结:(从别处拿来的先mark一下) 1.Robotium的 测试类ActivityInstrumentationTestCase2继承了TestCase类,即robo ...

  9. delphi调用webservice 转

      如今 Web Service 已越来越火了,在DotNet已开发的Web Service中,Delphi 7如何方便的调用DotNet写的Web Service呢?方法有两种,一种是在Delphi ...

  10. DD-WRT相关资源

    版本网站下载:Other Downloads,进入betas->2014 FTP下载:如ftp://ftp.dd-wrt.com/betas/2014/06-23-2014-r24461/ Re ...