SuperGcd

二进制算法

1. A = B, Gcd(A, B) = A;

2. A,B为偶数,  Gcd(A, B) = 2 * Gcd(A / 2, B / 2);

3. A 为偶数, B 为奇数,Gcd(A, B) = Gcd(A / 2, B);

4. A,B为奇数, Gcd(A, B) = Gcd(A - B, B)

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <algorithm>
  4. #include <string>
  5. #include <cmath>
  6. #include <cstring>
  7.  
  8. using namespace std;
  9. const int N = 2e5 + ;
  10.  
  11. int C[N * ];
  12. char s[N];
  13.  
  14. struct Node {
  15. inline void Init(int A[]) {
  16. scanf("%s", s); int Len = strlen(s); A[] = Len; for(int i = ; i <= Len; i ++) A[i] = s[i - ] - '';
  17. }
  18. inline int Cmp(int A[], int B[]) {
  19. if(A[] > B[]) return ; if(A[] < B[]) return -;
  20. for(int i = ; i <= A[]; i ++) if(A[i] > B[i]) return ; else if(A[i] < B[i]) return -;
  21. return ;
  22. }
  23. inline void Div(int A[]) {
  24. int tmp(), j = ;
  25. for(int i = ; i <= A[]; i ++) {tmp += A[i]; A[i] = tmp / ; tmp %= ; tmp *= ;}
  26. for(int i = ; i <= A[] && !A[i]; i ++, j = i); A[] = A[] - j + ;
  27. for(int i = ; i <= A[]; i ++) A[i] = A[i + j - ];
  28. }
  29. inline void Minus(int A[], int B[]) {
  30. for(int i = B[], j = A[]; i >= ; i --, j --) {
  31. if(A[j] < B[i]) {A[j] += ; A[j - ] --;} A[j] -= B[i];
  32. }
  33. int j = ;
  34. for(int i = ; i <= A[] && !A[i]; i ++, j = i); A[] = A[] - j + ;
  35. for(int i = ; i <= A[]; i ++) A[i] = A[i + j - ];
  36. }
  37. int a[N], b[N];
  38. inline void Mul(int A[], int B[]) {
  39. memset(C, , sizeof C);
  40. int j = ; for(int i = A[]; i >= ; i --) a[++ j] = A[i];
  41. j = ; for(int i = B[]; i >= ; i --) b[++ j] = B[i];
  42. for(int i = ; i <= A[]; i ++) {
  43. int x = ;
  44. for(int k = ; k <= B[]; k ++) {C[i + k - ] += a[i] * b[k] + x; x = C[i + k - ] / ; C[i + k - ] %= ;}
  45. C[i + B[]] = x;
  46. }
  47. j = A[] + B[]; while(!C[j] && j > ) j --; A[] = ;
  48. for(int i = j; i >= ; i --) A[++ A[]] = C[i];
  49. }
  50. inline void Out(int A[]) {for(int i = ; i <= A[]; i ++) printf("%d", A[i]);}
  51. } Big_num_work;
  52.  
  53. void Gcd(int A[], int B[], int &tot) {
  54. int imp = Big_num_work.Cmp(A, B); if(imp == ) return ; if(imp < ) {Gcd(B, A, tot); return ;}
  55. int ta(), tb(); if(A[A[]] % == ) Big_num_work.Div(A), ta = ; if(B[B[]] % == ) Big_num_work.Div(B), tb = ;
  56. if(ta && tb) Gcd(A, B, ++ tot);
  57. else if(!ta && !tb) {Big_num_work.Minus(A, B); Gcd(A, B, tot);}
  58. else Gcd(A, B, tot);
  59. }
  60.  
  61. int A[N], B[N], F[N];
  62.  
  63. int main() {
  64. Big_num_work.Init(A); Big_num_work.Init(B);
  65. int T = ; Gcd(A, B, T);
  66. if(T == ) Big_num_work.Out(A);
  67. else {
  68. int Tow[]; Tow[] = , Tow[] = ; F[] = F[] = ; for(int i = ; i <= T; i ++) Big_num_work.Mul(F, Tow);
  69. Big_num_work.Mul(A, F); Big_num_work.Out(A);
  70. }
  71. return ;
  72. }

luogu 2152的更多相关文章

  1. BZOJ 2152 / Luogu P2634 [国家集训队]聪聪可可 (点分治/树形DP)

    题意 一棵树,给定边权,求满足两点之间的路径上权值和为3的倍数的点对数量. 分析 点分治板题,对每个重心求子树下面的到根的距离模3分别为0,1,2的点的个数就行了. O(3nlogn)O(3nlogn ...

  2. BZOJ 2152 & 点分治

    Description: 只是打法法塔前测试一下板子 Code: /*================================= # Created time: 2016-04-20 14:3 ...

  3. Luogu 魔法学院杯-第二弹(萌新的第一法blog)

    虽然有点久远  还是放一下吧. 传送门:https://www.luogu.org/contest/show?tid=754 第一题  沉迷游戏,伤感情 #include <queue> ...

  4. luogu p1268 树的重量——构造,真正考验编程能力

    题目链接:http://www.luogu.org/problem/show?pid=1268#sub -------- 这道题费了我不少心思= =其实思路和标称毫无差别,但是由于不习惯ACM风格的题 ...

  5. BZOJ 2152: 聪聪可可 树分治

    2152: 聪聪可可 Description 聪聪和可可是兄弟俩,他们俩经常为了一些琐事打起来,例如家中只剩下最后一根冰棍而两人都想吃.两个人都想玩儿电脑(可是他们家只有一台电脑)……遇到这种问题,一 ...

  6. Code[VS] 2152 滑雪题解

    Code[VS] 2152 滑雪题解 题目描述 Description trs喜欢滑雪.他来到了一个滑雪场,这个滑雪场是一个矩形,为了简便,我们用r行c列的矩阵来表示每块地形.为了得到更快的速度,滑行 ...

  7. bzoj 2152聪聪可可

    2152: 聪聪可可 Time Limit: 3 Sec  Memory Limit: 259 MB Description 聪聪和可可是兄弟俩,他们俩经常为了一些琐事打起来,例如家中只剩下最后一根冰 ...

  8. 【BZOJ】2152: 聪聪可可(点分治)

    http://www.lydsy.com/JudgeOnline/problem.php?id=2152 随便点分..... 只是我在考虑一个地方逗乐.. 当路径长度mod3=0的点数直接乘起来就好. ...

  9. sdutoj 2152 Balloons

    http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=2152 Balloons Time Limit: ...

随机推荐

  1. 怎样获取当前页面框架的数量(即iframe和frame的数量)

    需要使用window.length, 或者window.frames.length; 如果页面中不包含frame和iframe元素, 则返回0; window.length === window.fr ...

  2. 火狐浏览器 访问所有HTTPS网站显示连接不安全解决办法

    当 Firefox 连接到一个安全的网站时(网址最开始为“https://”),它必须确认该网站出具的证书有效且使用足够高的加密强度.如果证书无法通过验证,或加密强度过低,Firefox 会中止连接到 ...

  3. 滤波器算法(2)-最小均方(LMS)

    2018.09.09 写的版本 ①残差平方和 ②平方损失函数: ③函数的极值点为偏导数为0的点:(将问题变成一个求极值的问题) ④求解得: matlab代码: ① y=ax+b+e方程 functio ...

  4. NodeList和HTMLCollection区别

    关于DOM集合接口,主要不同在于HTMLCollection是元素集合而NodeList是节点集合(既包括元素,也包括节点). 规定一下结果是: . node.childNodes 结果返回类型是 N ...

  5. 大学毕业时成都SAP和深圳腾讯的Offer,我是怎么选择的

    2006年校园招聘,我拿到了SAP成都研究院和深圳腾讯的offer,而我最后选择了前者. 当时我主要是基于以下四点考虑. SAP成都有最优秀的人才 2006年SAP成都研究院刚刚成立,对人才的挑选非常 ...

  6. OpenStack kilo版(4) Glance部署

    Glance简介 Glance-api:接受云系统镜像的构建.删除.读取请求 Glance-Registry:云系统的镜像注册服务 部署在controller节点 配置数据库 MariaDB [(no ...

  7. flask-sqlalchemy使用及数据迁移

    flask-sqlalchemy是flask框架在sqlalchemy基础上改造的一个orm框架 现在有两个实体Article文章和Category分类 一个分类下可能有多篇文章 相关示例: 项目相关 ...

  8. python高并发的详解

    一.什么是高并发 高并发(High Concurrency)是互联网分布式系统架构设计中必须考虑的因素之一,它通常是指,通过设计保证系统能够同时并行处理很多请求. 高并发相关常用的一些指标有响应时间( ...

  9. inotify文件监控

    参考:xxxx /*************************************************************************\* Copyright (C) M ...

  10. IO五种模型和select与epoll工作原理(引入nginx)

    用户速度体验的1-3-10原则 性能影响 有很多研究都表明,性能对用户的行为有很大的影响: 79%的用户表示不太可能再次打开一个缓慢的网站 47%的用户期望网页能在2秒钟以内加载 40%的用户 ...