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)

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <string>
#include <cmath>
#include <cstring> using namespace std;
const int N = 2e5 + ; int C[N * ];
char s[N]; struct Node {
inline void Init(int A[]) {
scanf("%s", s); int Len = strlen(s); A[] = Len; for(int i = ; i <= Len; i ++) A[i] = s[i - ] - '';
}
inline int Cmp(int A[], int B[]) {
if(A[] > B[]) return ; if(A[] < B[]) return -;
for(int i = ; i <= A[]; i ++) if(A[i] > B[i]) return ; else if(A[i] < B[i]) return -;
return ;
}
inline void Div(int A[]) {
int tmp(), j = ;
for(int i = ; i <= A[]; i ++) {tmp += A[i]; A[i] = tmp / ; tmp %= ; tmp *= ;}
for(int i = ; i <= A[] && !A[i]; i ++, j = i); A[] = A[] - j + ;
for(int i = ; i <= A[]; i ++) A[i] = A[i + j - ];
}
inline void Minus(int A[], int B[]) {
for(int i = B[], j = A[]; i >= ; i --, j --) {
if(A[j] < B[i]) {A[j] += ; A[j - ] --;} A[j] -= B[i];
}
int j = ;
for(int i = ; i <= A[] && !A[i]; i ++, j = i); A[] = A[] - j + ;
for(int i = ; i <= A[]; i ++) A[i] = A[i + j - ];
}
int a[N], b[N];
inline void Mul(int A[], int B[]) {
memset(C, , sizeof C);
int j = ; for(int i = A[]; i >= ; i --) a[++ j] = A[i];
j = ; for(int i = B[]; i >= ; i --) b[++ j] = B[i];
for(int i = ; i <= A[]; i ++) {
int x = ;
for(int k = ; k <= B[]; k ++) {C[i + k - ] += a[i] * b[k] + x; x = C[i + k - ] / ; C[i + k - ] %= ;}
C[i + B[]] = x;
}
j = A[] + B[]; while(!C[j] && j > ) j --; A[] = ;
for(int i = j; i >= ; i --) A[++ A[]] = C[i];
}
inline void Out(int A[]) {for(int i = ; i <= A[]; i ++) printf("%d", A[i]);}
} Big_num_work; void Gcd(int A[], int B[], int &tot) {
int imp = Big_num_work.Cmp(A, B); if(imp == ) return ; if(imp < ) {Gcd(B, A, tot); return ;}
int ta(), tb(); if(A[A[]] % == ) Big_num_work.Div(A), ta = ; if(B[B[]] % == ) Big_num_work.Div(B), tb = ;
if(ta && tb) Gcd(A, B, ++ tot);
else if(!ta && !tb) {Big_num_work.Minus(A, B); Gcd(A, B, tot);}
else Gcd(A, B, tot);
} int A[N], B[N], F[N]; int main() {
Big_num_work.Init(A); Big_num_work.Init(B);
int T = ; Gcd(A, B, T);
if(T == ) Big_num_work.Out(A);
else {
int Tow[]; Tow[] = , Tow[] = ; F[] = F[] = ; for(int i = ; i <= T; i ++) Big_num_work.Mul(F, Tow);
Big_num_work.Mul(A, F); Big_num_work.Out(A);
}
return ;
}

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. windows 下搭建go开发环境

    下载golang安装包: 步骤一: 先打开环境变量配置的界面 步骤二;配置我们的环境变量 对上图的一个说明: 1).path这个变量不需要再创建,因为系统本就有,在后面添加即可. 2).增加Go的bi ...

  2. Scratch 少儿编程之旅(四)— Scratch入门动画《小猫捉蝴蝶》(中)

    本期内容概括: 了解Scratch的更多操作,用[无限循环]来更改“小猫”角色的代码: 添加[碰到边缘就反弹]积木块指令: 更改角色的旋转模式和造型,让”小猫”走路更生动: 两种[循环]语句的区别: ...

  3. redis列表数据类型---list

    一.概述 redis列表是简单的字符串列表,按照插入顺序排序 可以添加一个元素到列表的头部(左边)或者尾部(右边) 一个列表最多可以包含2^32-1个元素(每个列表超过40亿个元素). 二.redis ...

  4. sprint boot websocket 服务端+html5 示例测试

    包依赖: <dependency> <groupId>org.springframework.boot</groupId> <artifactId>sp ...

  5. C# Winform 调试时某些项目不会自动重新生成

    右键启动项目→生成依赖性→项目依赖项 →勾选没有重新生成的项目

  6. robot framework 接口测试 http协议post请求json格式

    robot framework 接口测试 http协议post请求json格式 讲解一个基础版本.注意区分url地址和uri地址. rf和jmeter在添加服务器地址也就是ip地址的时候,只能url地 ...

  7. mac下卸载android studio

    Execute these commands from the terminal rm -Rf /Applications/Android\ Studio.app rm -Rf ~/Library/P ...

  8. js 单引号和双引号相互替换的实现方法

    1.双引号替换成单引号 var domo = JSON.stringify(address).replace(/\"/g,"'"); var a = {a:1,b:2}; ...

  9. 第十八篇:简易版web服务器开发

    在上篇有实现了一个静态的web服务器,可以接收web浏览器的请求,随后对请求消息进行解析,获取客户想要文件的文件名,随后根据文件名返回响应消息:那么这篇我们对该web服务器进行改善,通过多任务.非阻塞 ...

  10. 网络编程socketserver

    一.网络编程回顾 tcp是流式传输,字节流,数据与数据之间没有边界 优点:不限定长度,可靠传输 缺点:慢,和一端的通信连接conn会一直占用通信资源 udp协议式面向数据包的传输 优点:快,由于不需要 ...