首先我们知道,对于两个数a,b,他们的gcd情况有如下形式的讨论

  当a为奇数,b为偶数的时候gcd(a,b)=gcd(a div 2,b)

  当b为奇数,a为偶数的时候gcd(a,b)=gcd(a,b div 2)

  当a为偶数,b为偶数的时候gcd(a,b)=2*gcd(a div 2,b div 2)

  当a为奇数,b为奇数的时候,根据欧几里德定律,有gcd(a,b)=gcd(a-b,b) (a>b)时

  那么这道题就变成了不断地缩小a,b的范围了。直接高精就行了。当然数据为1,10^1000的时候会tle,题目比较良心没有这样的数据。

高精写渣了。

  1. /**************************************************************
  2. Problem:
  3. User: BLADEVIL
  4. Language: Pascal
  5. Result: Time_Limit_Exceed
  6. ****************************************************************/
  7.  
  8. //By BLADEVIL
  9. var
  10. s1, s2 :ansistring;
  11. f1, f2 :boolean;
  12. ans :ansistring;
  13. a, b, c :array[..] of longint;
  14. i :longint;
  15. doit :longint;
  16.  
  17. function max(s1,s2:ansistring):boolean;
  18. begin
  19. if length(s1)>length(s2) then exit(true);
  20. if (length(s1)=length(s2)) and (s1>s2) then exit(true);
  21. exit(false);
  22. end;
  23.  
  24. function divid(s:ansistring):ansistring;
  25. var
  26. i :longint;
  27. len :longint;
  28. ss :ansistring;
  29. begin
  30. fillchar(a,sizeof(a),);
  31. len:=length(s);
  32. for i:= to len do a[(len-i) div +]:=a[(len-i) div +]*+ord(s[i])-;
  33. len:=(len+) div ;
  34. for i:=len downto do
  35. if a[i] mod = then
  36. a[i]:=a[i] div else
  37. begin
  38. a[i]:=a[i] div ;
  39. a[i-]:=a[i-]+;
  40. end;
  41. a[]:=a[] div ;
  42. divid:='';
  43. for i:=len downto do
  44. begin
  45. str(a[i],ss);
  46. if a[i]< then divid:=divid+'';
  47. if a[i]< then divid:=divid+'';
  48. if a[i]< then divid:=divid+'';
  49. if a[i]< then divid:=divid+'';
  50. if a[i]< then divid:=divid+'';
  51. if a[i]< then divid:=divid+'';
  52. divid:=divid+ss;
  53. end;
  54. while (divid[]='') and (length(divid)>) do delete(divid,,);
  55. end;
  56.  
  57. function jian(s1,s2:ansistring):ansistring;
  58. var
  59. len1, len2 :longint;
  60. ss :ansistring;
  61. i :longint;
  62. begin
  63. fillchar(a,sizeof(a),);
  64. fillchar(b,sizeof(b),);
  65. fillchar(c,sizeof(c),);
  66. len1:=length(s1);
  67. for i:= to len1 do a[(len1-i) div +]:=a[(len1-i) div +]*+ord(s1[i])-;
  68. len2:=length(s2);
  69. for i:= to len2 do b[(len2-i) div +]:=b[(len2-i) div +]*+ord(s2[i])-;
  70. len1:=(len1+) div ;
  71. len2:=(len2+) div ;
  72. for i:= to len1 do
  73. begin
  74. c[i]:=c[i]+a[i]-b[i];
  75. if c[i]< then
  76. begin
  77. c[i]:=c[i]+;
  78. c[i+]:=c[i+]-;
  79. end;
  80. end;
  81. jian:='';
  82. for i:=len1 downto do
  83. begin
  84. str(c[i],ss);
  85. if c[i]< then jian:=jian+'';
  86. if c[i]< then jian:=jian+'';
  87. if c[i]< then jian:=jian+'';
  88. if c[i]< then jian:=jian+'';
  89. if c[i]< then jian:=jian+'';
  90. if c[i]< then jian:=jian+'';
  91. jian:=jian+ss;
  92. end;
  93. while (jian[]='') and (length(jian)>) do delete(jian,,);
  94. end;
  95.  
  96. function mul(s:ansistring):ansistring;
  97. var
  98. len :longint;
  99. i :longint;
  100. ss :ansistring;
  101. begin
  102. len:=length(s);
  103. fillchar(a,sizeof(a),);
  104. for i:= to len do a[(len-i) div +]:=a[(len-i) div +]*+ord(s[i])-;
  105. len:=(len+) div ;
  106. for i:= to len do a[i]:=a[i]*;
  107. for i:= to len do
  108. begin
  109. a[i+]:=a[i+]+a[i] div ;
  110. a[i]:=a[i] mod ;
  111. end;
  112. inc(len);
  113. mul:='';
  114. for i:=len downto do
  115. begin
  116. str(a[i],ss);
  117. if a[i]< then mul:=mul+'';
  118. if a[i]< then mul:=mul+'';
  119. if a[i]< then mul:=mul+'';
  120. if a[i]< then mul:=mul+'';
  121. if a[i]< then mul:=mul+'';
  122. if a[i]< then mul:=mul+'';
  123. mul:=mul+ss;
  124. end;
  125. while (mul[]='') and (length(mul)>) do delete(mul,,);
  126. end;
  127.  
  128. begin
  129. readln(s1);
  130. while (s1[]='') and (length(s1)>) do delete(s1,,);
  131. readln(s2);
  132. while (s2[]='') and (length(s2)>) do delete(s2,,);
  133. doit:=;
  134. while s1<>s2 do
  135. begin
  136. if ord(s1[length(s1)]) mod = then f1:=true else f1:=false;
  137. if ord(s2[length(s2)]) mod = then f2:=true else f2:=false;
  138. if f1 and f2 then
  139. begin
  140. s1:=divid(s1);
  141. s2:=divid(s2);
  142. inc(doit);
  143. end else
  144. begin
  145. if f1 then s1:=divid(s1);
  146. if f2 then s2:=divid(s2);
  147. if (not f1) and (not f2) then
  148. if max(s1,s2) then s1:=jian(s1,s2) else s2:=jian(s2,s1);
  149. end;
  150. end;
  151. ans:=s1;
  152. for i:= to doit do ans:=mul(ans);
  153. writeln(ans);
  154. end.

bzoj 1876 高精的更多相关文章

  1. BZOJ.1210.[HNOI2004]邮递员(插头DP Hash 高精)

    BZOJ 洛谷 http://www.cnblogs.com/LadyLex/p/7326874.html 插头DP.\(m+1\)个插头的状态需要用三进制表示:\(0\)表示无插头,\(1\)表示是 ...

  2. bzoj 3287: Mato的刷屏计划 高精水题 && bzoj AC150

    3287: Mato的刷屏计划 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 124  Solved: 43[Submit][Status] Desc ...

  3. BZOJ.1005.[HNOI2008]明明的烦恼(Prufer 高精 排列组合)

    题目链接 若点数确定那么ans = (n-2)!/[(d1-1)!(d2-1)!...(dn-1)!] 现在把那些不确定的点一起考虑(假设有m个),它们在Prufer序列中总出现数就是left=n-2 ...

  4. bzoj 1089: [SCOI2003]严格n元树【dp+高精】

    设f[i]为深度为i的n元树数目,s为f的前缀和 s[i]=s[i-1]^n+1,就是增加一个根,然后在下面挂n个子树,每个子树都有s[i-1]种 写个高精就行了,好久没写WA了好几次-- #incl ...

  5. bzoj 4807: 車【组合数+高精+线性筛】

    设n>m,答案是\( C_n^m \),然后高精就行了 具体做法是先把指数筛出来,然后对每个数因数分解,记录质因子个数,最后被除数减去除数质因子个数,把剩下的质因子乘起来就行了 #include ...

  6. bzoj 1754: [Usaco2005 qua]Bull Math【高精乘法】

    高精乘法板子 然而WA了两次也是没救了 #include<iostream> #include<cstdio> #include<cstring> using na ...

  7. bzoj 1876

    传送门 http://www.lydsy.com/JudgeOnline/problem.php?id=1876 二进制gcd 学到了(' '      ) 高精还得压位,最开始没写压位,然后调了1h ...

  8. Linux 高精確的時序(sleep, usleep,nanosleep) from:http://blog.sina.com.cn/s/blog_533ab41c0100htae.html

    Linux 高精確的時序(sleep, usleep,nanosleep) (2010-04-14 17:18:26) 转载▼ 标签: 杂谈 分类: linux 首先, 我会说不保证你在使用者模式 ( ...

  9. c++ 普通高精除高精

    //codevs3118 高精度练习之除法 //打出了高精除高精,内心有点小激动. //还记得已开始学的时候非常难打 #include<cstdio>#include<cstring ...

随机推荐

  1. 4,由spring展开的串烧

    一.什么是Spring框架?Spring框架有哪些主要模块? Spring框架是一个为Java应用程序的开发提供了综合.广泛的基础性支持的Java平台.Spring帮助开发者解决了开发中基础性的问题, ...

  2. Django学习笔记(一):环境安装与简单实例

    Django学习笔记(一):环境安装与简单实例 通过本文章实现: Django在Windows中的环境安装 Django项目的建立并编写简单的网页,显示欢迎语与当前时间 一.环境安装 结合版本兼容性等 ...

  3. Python网络编程(进程池、进程间的通信)

    线程池的原理:        线程池是预先创建线程的一种技术.线程池在还没有任务到来之前,        创建一定数量的线程,放入空闲队列中.这些线程都是处于睡眠状态,        即均为启动,不消 ...

  4. Java并发基础--Thread类

    一.Thread类的构成 Thread类实现Runnable接口.部分源码如下: 二.Thread类常用方法 1.currentThread()方法 currentThread()方法可以返回代码段正 ...

  5. 感知机学习算法(PLA)

    Perception Learning Algorithm, PLA 1.感知机 感知机是一种线性分类模型,属于判别模型. 感知机模型给出了由输入空间到输出空间的映射: f(X) = sign(WTX ...

  6. 对TDD的实践感悟

    文章:我的TDD实践:可测试性驱动开发(上) 文章表达的思想是,达到一个目的并非只有一种套路,作者用写代码时,时刻考虑代码的可测试性,来推动项目的合理开发.

  7. 使用Microsoft EnterpriseLibrary(微软企业库)日志组件把系统日志写入数据库和xml文件

    这里只是说明在项目中如何配置使用微软企业库的日志组件,对数据库方面的配置请参考其他资料. 1.在项目中添加Microsoft.Practices.EnterpriseLibrary.Data.dll. ...

  8. 健康领域今年开始井喷了,养老地产和私人医生这两个领域目测成为下一轮BAT在健康领域布局的竞争方向

    医疗行业做了六年多的时间,今年到了井喷的阶段,腾讯先是入股了丁香园,然后又一亿美金融资挂号网,春雨医生获得5000万美元的C轮融资,这是要上市的节奏.. 从互联网战略上,健康网和医疗网都是做资料刚开始 ...

  9. linux安装mysql之设置远程访问权限

    1.将3306端口加入防火墙 /sbin/iptables -I INPUT -p tcp --dport 3306-j ACCEPT  #添加端口3306/etc/rc.d/init.d/iptab ...

  10. BZOJ4456 ZJOI2016旅行者(分治+最短路)

    感觉比较套路,每次在长边中轴线处切一刀,求出切割线上的点对矩形内所有点的单源最短路径,以此更新每个询问,递归处理更小的矩形.因为若起点终点跨过中轴线是肯定要经过的,而不跨过中轴线的则可以选择是否经过中 ...