高精度gcd
#include<iostream>
#include<cstdio>
#include<cstring>
#define inf 1000000000
using namespace std;
char ch1[],ch2[];
int la,lb,cnt;
struct data{int a[],l;}a,b;
bool com()
{
if(a.l<b.l)return ;
if(a.l>b.l)return ;
for(int i=a.l;i>;--i)
if(a.a[i]>b.a[i])return ;
else if(a.a[i]<b.a[i])return ;
return ;
}
void print(data a)
{
while(a.a[a.l]==)a.l--;
for(int i=a.l;i>;--i)
if(i==a.l)printf("%d",a.a[i]);
else printf("%09d",a.a[i]);
}
inline data sub(data a,data b)
{
int k;
data c;
for(int i=;i<=;++i)
{
if(i<=b.l)c.a[i]=a.a[i]-b.a[i];
else if(i<=a.l)c.a[i]=a.a[i];
else c.a[i]=;
if(c.a[i]<)
{
c.a[i]+=inf;
a.a[i+]--;
}
}
c.l=a.l;
while(c.a[c.l]==&&c.l)c.l--;
return c;
}
void diva()
{
for(int i=;i<=a.l;i++)
{
if(a.a[i]&)a.a[i-]+=inf/;
a.a[i]>>=;
}
if(!a.a[a.l])a.l--;
}
void divb()
{
for(int i=;i<=b.l;i++)
{
if(b.a[i]&)b.a[i-]+=inf/;
b.a[i]>>=;
}
if(!b.a[b.l])b.l--;
}
void mul()
{
for(int i=a.l;i>;i--)
{
a.a[i]<<=;
a.a[i+]+=a.a[i]/inf;
a.a[i]%=inf;
}
while(a.a[a.l]>)a.l++;
for(int i=b.l;i>;i--)
{
b.a[i]<<=;
b.a[i+]+=b.a[i]/inf;
b.a[i]%=inf;
}
while(b.a[b.l]>)b.l++;
}
int main()
{
scanf("%s%s",ch1+,ch2+);
la=strlen(ch1+);lb=strlen(ch2+);
if(la%)a.l=la/+;
else a.l=la/;
if(lb%)b.l=lb/+;
else b.l=lb/;
for(int i=;i<=a.l;++i)
{
int k1=max(,la-i*+),k2=la-(i-)*;
for(int j=k1;j<=k2;++j)
a.a[i]=a.a[i]*+ch1[j]-'';
}
for(int i=;i<=b.l;++i)
{
int k1=max(,lb-i*+),k2=lb-(i-)*;
for(int j=k1;j<=k2;++j)
b.a[i]=b.a[i]*+ch2[j]-'';
}
while()
{
if((a.a[]%==)&&(b.a[]%==)){diva();divb();cnt++;}
else if((a.a[]%==))diva();
else if((b.a[]%==))divb();
if(com()){a=sub(a,b);if(!a.l){while(cnt--)mul();print(b);break;}}
else {b=sub(b,a);if(!b.l){while(cnt--)mul();print(a);break;}}
}
return ;
}
高精度gcd的更多相关文章
- 浅谈Stein算法求最大公约数(GCD)的原理及简单应用
一.Stein算法过程及其简单证明 1.一般步骤: s1:当两数均为偶数时将其同时除以2至至少一数为奇数为止,记录除掉的所有公因数2的乘积k: s2:如果仍有一数为偶数,连续除以2直至该数为奇数为止: ...
- 高精度&&FFT
ACM-高精度模板(综合篇) 时间:-- :: 阅读: 评论: 收藏: [点我收藏+] 标签:高精度 在这里,我们约定,能用int表示的数据视为单精度,否则为高精度.所有函数的设计均采用带返回值的形式 ...
- SDOI2009
1226: [SDOI2009]学校食堂Dining Description 小F 的学校在城市的一个偏僻角落,所有学生都只好在学校吃饭.学校有一个食堂,虽然简陋,但食堂大厨总能做出让同学们满意的菜肴 ...
- 【BZOJ】【1876】【SDOI2009】SuperGCD
高精度+GCD 唔……高精gcd其实可以这么算: \[ GCD(a,b)= \begin{cases} a & b=0 \\ 2*GCD(\frac{a}{2},\frac{b}{2}) &a ...
- Bzoj1498&1416: [NOI2006]神奇的口袋
什么鬼双倍经验题??? Sol 考虑在第\(k\)次摸到\(y\)的概率 如果上次摸到\(y\),目前有\(sum\)个球,\(y\)有\(a[y]\)个,那么概率就是\(\frac{a[y]+d}{ ...
- ACM数学
1.burnside定理,polya计数法 这个专题我单独写了个小结,大家可以简单参考一下:polya 计数法,burnside定理小结 2.置换,置换的运算 置换的概念还是比较好理解的,< ...
- exam9.6&&7
emmm 改题稍紧张,以后几篇并一起写 9.6 (前十并没有参加本次考试) 于是我就rank8了 一道题一道题来 先说T1: 显然是一个高精度GCD,于是打算用计算器算一下时间复杂度 众所周知gcd是 ...
- HZOI20190906模拟38 金,斯诺,赤
题面:https://www.cnblogs.com/Juve/articles/11479415.html T1:高精度gcd,其实不用写高精度取模,gcd还有一种求法 int gcd(int a, ...
- JZOJPJ-C 8/21题解
原题大战D1 吐槽: T1 \(O(N^2)\; N \leq 26\) N大时还要写高精, 可以增加难度 T2 不给范围 T3 居然没有完全卡掉 不对应该赞美出题人 T4 PJ考个四边形不等式?? ...
随机推荐
- 初始HTML_表格
Html表格 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <ti ...
- DDL、DML、TCL
一.DDL 1.创建表(CREATE) (1)数据库对大小写不敏感,只对字符串大小写敏感. (2)使用create关键字创建表.(-- 表示注释). 格式: CREATE TABLE 表名( 字段名1 ...
- CSS的border-radius 设置圆弧
现象:将div变为有一定幅度的圆形.椭圆形等 方法:使用css的border-radius 属性进行设置CSS3 border-radius 属性:向 div 元素添加圆角边框: 一:首先建立一个di ...
- toast文本提示信息元素获取
在做自动化的过程中,我们有可能会遇到toast提示语,这种提示语只会显示一两秒的样子,导致我们获取元素很困难 今天总结下怎么获取这个toast元素吧 例如下图所示的这种toast提示 图中红框的这种元 ...
- XposedInstaller 是如何安装的
Launcher 如何通过startActivity 传送一个 intent 到 zygote 如何 接收到它并且 fork出该app的进程的? 安装框架的时候会现有各种检查,比如当前系统版本等 下载 ...
- HashMap底层实现及原理
注意:文章的内容基于JDK1.7进行分析.1.8做的改动文章末尾进行讲解. 一.先来熟悉一下我们常用的HashMap: 1.HashSet和HashMap概述 对于HashSst及其子类而 ...
- ACM-求质因数
求输入数字的所有质因数,并将所有质因数进行排序,并以质因数+空格的形式输出 #include <iostream> #include <string> #include < ...
- Apache(基于端口号)
1.配置服务器的IP地址 2. 创建网站数据目录 (1).分别创建端口为6111,6222的网站数据目录 (2).分别在网站数据目录中写入不同的内容 3.在配置文件中描述基于端口号的虚拟主机 (1) ...
- ORB-SLAM2初步(Tracking.cpp)
今天主要是分析一下Tracking.cpp这个文件,它是实现跟踪过程的主要文件,这里主要针对单目,并且只是截取了部分代码片段. 一.跟踪过程分析 首先构造函数中使用初始化列表对跟踪状态mState(N ...
- 首次使用gradle出现Could not find method leftShift() for arguments解决办法
1.在win10桌面编写test.gradle脚本,里面内容如下 task helloword << { println 'Hello gradle qick start' } 2.在do ...