传送门 http://www.lydsy.com/JudgeOnline/problem.php?id=1876

二进制gcd 学到了(' '      ) 高精还得压位,最开始没写压位,然后调了1h后又重写了一遍(' '     ) 怨念深重

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <algorithm>
  5. using namespace std;
  6.  
  7. const int maxn = 10010;
  8. const int inf = 1000000000;
  9.  
  10. struct bgint {
  11. int n, a[maxn];
  12. bgint() {
  13. n = 0; memset(a, 0, sizeof(a));
  14. }
  15. bgint operator - (const bgint &x) const {
  16. bgint ret; ret.n = max(x. n, this-> n);
  17. for(int i = 1; i <= ret. n; ++ i) {
  18. ret. a[i] += this-> a[i] - x. a[i];
  19. if(ret. a[i] < 0) ret. a[i] += inf, ret. a[i + 1] --;
  20. }
  21. while(ret. a[ret. n] == 0 && ret. n != 1) ret. n --;
  22. return ret;
  23. }
  24. };
  25.  
  26. bgint mov(const bgint &x) {
  27. bgint ret; ret. n = x. n;
  28. for(int i = 1; i <= ret. n; ++ i) {
  29. ret. a[i] += x. a[i] * 2;
  30. ret. a[i + 1] += ret. a[i] / inf;
  31. ret. a[i] %= inf;
  32. }
  33. if(ret. a[ret. n + 1]) ret. n ++;
  34. return ret;
  35. }
  36.  
  37. bgint div(const bgint &x) {
  38. bgint ret;
  39. if(x. a[x.n] < 2) {
  40. ret. n = x. n - 1;
  41. for(int i = 1; i <= ret. n; ++ i) ret. a[i] = x. a[i];
  42. ret. a[ret. n] += x. a[x.n] * inf;
  43. for(int i = ret. n; i >= 1; -- i) ret. a[i - 1] += ret. a[i] % 2 * inf, ret. a[i] /= 2;
  44. ret. a[0] = 0;
  45. }
  46. else {
  47. ret. n = x.n;
  48. for(int i = 1; i <= ret. n; ++ i) ret. a[i] = x. a[i];
  49. for(int i = ret. n; i >= 1; -- i) ret. a[i - 1] += ret. a[i] % 2 * inf, ret. a[i] /= 2;
  50. ret. a[0] = 0;
  51. }
  52. return ret;
  53. }
  54.  
  55. bool even (const bgint &x) {
  56. return (x. a[1] & 1);
  57. }
  58.  
  59. bool is (const bgint &x, const bgint &t) {
  60. if(x. n != t. n) return 0;
  61. for(int i = 1; i <= x. n; ++ i) if(x. a[i] != t. a[i]) return 0;
  62. return 1;
  63. }
  64.  
  65. bool com(const bgint &x, const bgint &t) {
  66. if(x. n > t. n) return 0;
  67. else if(x. n < t. n) return 1;
  68. for(int i = x. n; i >= 1; -- i) {
  69. if(x. a[i] > t. a[i]) return 0;
  70. else if(x. a[i] < t.a[i]) return 1;
  71. }
  72. return 0;
  73. }
  74.  
  75. void print(const bgint &x) {
  76. for(int i = x. n; i >= 1; -- i) {
  77. if(i == x.n ) printf("%d", x. a[i]);
  78. else printf("%09d", x. a[i]);
  79. }
  80. }
  81.  
  82. bgint gcd(bgint a, bgint b) {
  83. bgint ret; ret. a[1] = 1, ret. n = 1;
  84. int cnt = 0;
  85. while(!is(a, b)) {
  86. if(even(a)) {
  87. if(even(b)) {
  88. if(!com(a, b)) a = div((a - b));
  89. else b = div((b - a));
  90. }
  91. else b = div(b);
  92. }
  93. else {
  94. if(even(b)) a = div(a);
  95. else b = div(b), a = div(a), cnt ++;
  96. }
  97. // ++ x; print(a); cout << " "; print(b); cout << endl;
  98. }
  99. for(int i = 1; i <= cnt; ++ i) a = mov(a);
  100. return a;
  101. }
  102.  
  103. char s[maxn];
  104.  
  105. bgint read() {
  106. scanf("%s", s + 1);
  107. bgint ret; ret. n = (int)strlen(s + 1); ret. n = ret. n % 9 == 0 ? ret. n / 9 : ret. n / 9 + 1;
  108. int sl = (int)strlen(s + 1);
  109. for(int i = 1; i <= ret. n; ++ i) {
  110. int t = 1;
  111. for(int j = (i - 1) * 9 + 1; j <= min(i * 9, sl); ++ j)
  112. ret. a[i] += (int)(s[sl - j + 1] - '0') * t, t *= 10;
  113. }
  114. return ret;
  115. }
  116.  
  117. void sov() {
  118. bgint x = read(), t = read();
  119. print(gcd(x, t));
  120. }
  121.  
  122. int main() {
  123. //freopen("test.in", "r", stdin);
  124. //freopen("test.out", "w", stdout);
  125. sov();
  126. return 0;
  127. }

bzoj 1876的更多相关文章

  1. BZOJ 1876: [SDOI2009]SuperGCD

    1876: [SDOI2009]SuperGCD Time Limit: 4 Sec  Memory Limit: 64 MBSubmit: 3060  Solved: 1036[Submit][St ...

  2. bzoj 1876 [SDOI2009]SuperGCD(高精度+更相减损)

    1876: [SDOI2009]SuperGCD Time Limit: 4 Sec  Memory Limit: 64 MBSubmit: 2384  Solved: 806[Submit][Sta ...

  3. BZOJ 1876: [SDOI2009]SuperGCD( 更相减损 + 高精度 )

    更相减损,要用高精度.... --------------------------------------------------------------- #include<cstdio> ...

  4. BZOJ 1876 SuperGCD

    Description Sheng bill有着惊人的心算能力,甚至能用大脑计算出两个巨大的数的GCD(最大公约数)!因此他经常和别人比赛计算GCD.有一天Sheng bill很嚣张地找到了你,并要求 ...

  5. 「BZOJ 1876」「SDOI 2009」SuperGCD「数论」

    题意 求\(\gcd(a, b)\),其中\(a,b\leq10^{10000}\) 题解 使用\(\text{Stein}\)算法,其原理是不断筛除因子\(2\)然后使用更相减损法 如果不筛\(2\ ...

  6. bzoj 1876 高精

    首先我们知道,对于两个数a,b,他们的gcd情况有如下形式的讨论 当a为奇数,b为偶数的时候gcd(a,b)=gcd(a div 2,b) 当b为奇数,a为偶数的时候gcd(a,b)=gcd(a,b ...

  7. BZOJ 1876 [SDOI2009] SuperGcd | PY好题

    题面就是让你求两个超级大整数,求GCD 题解: 题目本意应该是出题人想考考高精度取膜 但是可以通过一种神奇的Stein算法来做 由J. Stein 1961年提出的Stein算法很好的解决了欧几里德算 ...

  8. [SDOI2009][BZOJ 1876]SuperGCD

    Description Sheng bill有着惊人的心算能力,甚至能用大脑计算出两个巨大的数的GCD(最大公约 数)!因此他经常和别人比 赛计算GCD.有一天Sheng bill很嚣张地找到了你,并 ...

  9. 【BZOJ】【1876】【SDOI2009】SuperGCD

    高精度+GCD 唔……高精gcd其实可以这么算: \[ GCD(a,b)= \begin{cases} a & b=0 \\ 2*GCD(\frac{a}{2},\frac{b}{2}) &a ...

随机推荐

  1. 【Java】遍历Map<String,String>

    Map<String, String> map = new HashMap<>(); map.put("key1", "value1") ...

  2. 【Linux】端口反查进程

    平时时常遇到端口占用的情况,又不知道端口是哪个服务启的. 本文以80端口为例. [root@localhost jenkins]# netstat -tunlp | grep 80 tcp6 0 0 ...

  3. Spring-Boot"原生态"的logback

    前言 Logback是由 log4j创始人设计的又一个开源日志组件: logback当前分成三个模块: logback-core logbackclassic logback-access logba ...

  4. 数论---lcm和gcd

    cd即最大公约数,lcm即最小公倍数. 首先给出a×b=gcd×lcm 证明:令gcd(a,b)=k,a=xk,b=yk,则a×b=xykk,而lcm=xyk,所以ab=gcd*lcm. 所以求lcm ...

  5. exporter

    何为 Prometheus Exporter? Prometheus 监控基于一个很简单的模型: 主动抓取目标的指标接口(HTTP 协议)获取监控指标, 再存储到本地或远端的时序数据库. Promet ...

  6. VMware虚拟机重新挂载共享目录

    经常遇到设置的共享目录在重启虚拟机后找不到的情况,于是写了个脚本:mount-shared-folders. 前提是你的虚拟机中已经安装了VMware的相关工具(一般装完虚拟机都会自动安装上的) #! ...

  7. VUE mixins(混入)

    mixins是在引入组件之后 将组件内部的内容如data等方法.method等属性与父组件相应内容进行合并 相当于在引入后 父组件的各种属性方法都被扩充了. 单纯组件引用:           父组件 ...

  8. 转 : jconsole 和jvisualVM 监控远程 spring boot程序

    监控java 程序 增加启动参数 java  \ -Djava.rmi.server.hostname=192.168.2.39 \ -Dcom.sun.management.jmxremote \- ...

  9. JVM系列(二) — Java垃圾收集介绍

    这篇文章主要从以下几个方面介绍垃圾收集的相关知识 一.判断对象是否已死 二.主流垃圾收集算法 三.内存分配与回收策略 本章节主要从以下几个思考点着手介绍垃圾回收的相关知识:哪些内存需要回收?什么时候回 ...

  10. [fw]PAGE_SIZE & PAGE_SHIFT & _AC()

    PAGE_SIZE & PAGE_SHIFT & _AC() 在大多系统下,PAGE_SIZE被定义为 4k 大小,即 4096 字节. 在 x86 系统里,PAGE_SIZE 和 P ...