高精度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考个四边形不等式?? ...
随机推荐
- vue学习笔记(三): 启动说明
1.启动页面:index.html <!DOCTYPE html> <html> <head> <meta charset="utf-8" ...
- JavaScript:for循环中let与var变量的绑定
碰到一道题: for(var i=0;i<2;i++){ setTimeout(function(){ console.log(i); },100) } //输出结果为:2 2 for(let ...
- 多线程CGD调度组原理
我们常用的GCD调度组方式 //GCD常用调度组写法 -(void)demo1{ //创建调度组和队列 dispatch_group_t group = dispatch_group_create() ...
- 微软发布Visual Studio Online公共预览版和ML.NET 1.4
在今天的Ignite 2019上,Microsoft启动了 Visual Studio Online 公共预览版.Visual Studio Online将Visual Studio,云托管的开发人员 ...
- Jmeter通过正则表达式获取登录后token
1.引用名称:即参数化,便于后面调用登录后获取的token 2.正则表达式:"token":"([0-9 a-z -]+?)" 3.模板:设置为 "$ ...
- minimize.m:共轭梯度法更新BP算法权值
minimize.m:共轭梯度法更新BP算法权值 作者:凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ Carl Edward Rasmussen在高斯机器学 ...
- 详解Vue生命周期---1
目录 Vue实例的生命周期全过程(图) 在beforeCreate和created钩子函数间的生命周期 created钩子函数和beforeMount间的生命周期 el选项的有无对生命周期过程的影响 ...
- 2019.6.13_SQL语句中----删除表数据drop、truncate和delete的用法
一.SQL中的语法 1.drop table 表名称 eg: drop table dbo.Sys_Test 2.truncate table 表 ...
- Codeforces Round #573 (Div. 1)
Preface 军训终于结束了回来补一补之前的坑发现很多题目题意都忘记了 这场感觉难度适中,F由于智力不够所以弃了,E的话石乐志看了官方英文题解才发现自己已经胡了一大半就差实现了233 水平下降严重. ...
- LCT好题总结
写在前面: 初探多项式之后,开始了数据结构之旅,可持久化数据结构的总结大概是咕了,只总结一些$LCT$的题 T1:水管局长数据加强版 发现题中只有删边操作,而我们只会做加边,所有考虑时光倒流 先在最后 ...