首先我们知道,对于两个数a,b,他们的gcd情况有如下形式的讨论

  当a为奇数,b为偶数的时候gcd(a,b)=gcd(a div 2,b)

  当b为奇数,a为偶数的时候gcd(a,b)=gcd(a,b div 2)

  当a为偶数,b为偶数的时候gcd(a,b)=2*gcd(a div 2,b div 2)

  当a为奇数,b为奇数的时候,根据欧几里德定律,有gcd(a,b)=gcd(a-b,b) (a>b)时

  那么这道题就变成了不断地缩小a,b的范围了。直接高精就行了。当然数据为1,10^1000的时候会tle,题目比较良心没有这样的数据。

高精写渣了。

/**************************************************************
Problem:
User: BLADEVIL
Language: Pascal
Result: Time_Limit_Exceed
****************************************************************/ //By BLADEVIL
var
s1, s2 :ansistring;
f1, f2 :boolean;
ans :ansistring;
a, b, c :array[..] of longint;
i :longint;
doit :longint; function max(s1,s2:ansistring):boolean;
begin
if length(s1)>length(s2) then exit(true);
if (length(s1)=length(s2)) and (s1>s2) then exit(true);
exit(false);
end; function divid(s:ansistring):ansistring;
var
i :longint;
len :longint;
ss :ansistring;
begin
fillchar(a,sizeof(a),);
len:=length(s);
for i:= to len do a[(len-i) div +]:=a[(len-i) div +]*+ord(s[i])-;
len:=(len+) div ;
for i:=len downto do
if a[i] mod = then
a[i]:=a[i] div else
begin
a[i]:=a[i] div ;
a[i-]:=a[i-]+;
end;
a[]:=a[] div ;
divid:='';
for i:=len downto do
begin
str(a[i],ss);
if a[i]< then divid:=divid+'';
if a[i]< then divid:=divid+'';
if a[i]< then divid:=divid+'';
if a[i]< then divid:=divid+'';
if a[i]< then divid:=divid+'';
if a[i]< then divid:=divid+'';
divid:=divid+ss;
end;
while (divid[]='') and (length(divid)>) do delete(divid,,);
end; function jian(s1,s2:ansistring):ansistring;
var
len1, len2 :longint;
ss :ansistring;
i :longint;
begin
fillchar(a,sizeof(a),);
fillchar(b,sizeof(b),);
fillchar(c,sizeof(c),);
len1:=length(s1);
for i:= to len1 do a[(len1-i) div +]:=a[(len1-i) div +]*+ord(s1[i])-;
len2:=length(s2);
for i:= to len2 do b[(len2-i) div +]:=b[(len2-i) div +]*+ord(s2[i])-;
len1:=(len1+) div ;
len2:=(len2+) div ;
for i:= to len1 do
begin
c[i]:=c[i]+a[i]-b[i];
if c[i]< then
begin
c[i]:=c[i]+;
c[i+]:=c[i+]-;
end;
end;
jian:='';
for i:=len1 downto do
begin
str(c[i],ss);
if c[i]< then jian:=jian+'';
if c[i]< then jian:=jian+'';
if c[i]< then jian:=jian+'';
if c[i]< then jian:=jian+'';
if c[i]< then jian:=jian+'';
if c[i]< then jian:=jian+'';
jian:=jian+ss;
end;
while (jian[]='') and (length(jian)>) do delete(jian,,);
end; function mul(s:ansistring):ansistring;
var
len :longint;
i :longint;
ss :ansistring;
begin
len:=length(s);
fillchar(a,sizeof(a),);
for i:= to len do a[(len-i) div +]:=a[(len-i) div +]*+ord(s[i])-;
len:=(len+) div ;
for i:= to len do a[i]:=a[i]*;
for i:= to len do
begin
a[i+]:=a[i+]+a[i] div ;
a[i]:=a[i] mod ;
end;
inc(len);
mul:='';
for i:=len downto do
begin
str(a[i],ss);
if a[i]< then mul:=mul+'';
if a[i]< then mul:=mul+'';
if a[i]< then mul:=mul+'';
if a[i]< then mul:=mul+'';
if a[i]< then mul:=mul+'';
if a[i]< then mul:=mul+'';
mul:=mul+ss;
end;
while (mul[]='') and (length(mul)>) do delete(mul,,);
end; begin
readln(s1);
while (s1[]='') and (length(s1)>) do delete(s1,,);
readln(s2);
while (s2[]='') and (length(s2)>) do delete(s2,,);
doit:=;
while s1<>s2 do
begin
if ord(s1[length(s1)]) mod = then f1:=true else f1:=false;
if ord(s2[length(s2)]) mod = then f2:=true else f2:=false;
if f1 and f2 then
begin
s1:=divid(s1);
s2:=divid(s2);
inc(doit);
end else
begin
if f1 then s1:=divid(s1);
if f2 then s2:=divid(s2);
if (not f1) and (not f2) then
if max(s1,s2) then s1:=jian(s1,s2) else s2:=jian(s2,s1);
end;
end;
ans:=s1;
for i:= to doit do ans:=mul(ans);
writeln(ans);
end.

bzoj 1876 高精的更多相关文章

  1. BZOJ.1210.[HNOI2004]邮递员(插头DP Hash 高精)

    BZOJ 洛谷 http://www.cnblogs.com/LadyLex/p/7326874.html 插头DP.\(m+1\)个插头的状态需要用三进制表示:\(0\)表示无插头,\(1\)表示是 ...

  2. bzoj 3287: Mato的刷屏计划 高精水题 && bzoj AC150

    3287: Mato的刷屏计划 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 124  Solved: 43[Submit][Status] Desc ...

  3. BZOJ.1005.[HNOI2008]明明的烦恼(Prufer 高精 排列组合)

    题目链接 若点数确定那么ans = (n-2)!/[(d1-1)!(d2-1)!...(dn-1)!] 现在把那些不确定的点一起考虑(假设有m个),它们在Prufer序列中总出现数就是left=n-2 ...

  4. bzoj 1089: [SCOI2003]严格n元树【dp+高精】

    设f[i]为深度为i的n元树数目,s为f的前缀和 s[i]=s[i-1]^n+1,就是增加一个根,然后在下面挂n个子树,每个子树都有s[i-1]种 写个高精就行了,好久没写WA了好几次-- #incl ...

  5. bzoj 4807: 車【组合数+高精+线性筛】

    设n>m,答案是\( C_n^m \),然后高精就行了 具体做法是先把指数筛出来,然后对每个数因数分解,记录质因子个数,最后被除数减去除数质因子个数,把剩下的质因子乘起来就行了 #include ...

  6. bzoj 1754: [Usaco2005 qua]Bull Math【高精乘法】

    高精乘法板子 然而WA了两次也是没救了 #include<iostream> #include<cstdio> #include<cstring> using na ...

  7. bzoj 1876

    传送门 http://www.lydsy.com/JudgeOnline/problem.php?id=1876 二进制gcd 学到了(' '      ) 高精还得压位,最开始没写压位,然后调了1h ...

  8. Linux 高精確的時序(sleep, usleep,nanosleep) from:http://blog.sina.com.cn/s/blog_533ab41c0100htae.html

    Linux 高精確的時序(sleep, usleep,nanosleep) (2010-04-14 17:18:26) 转载▼ 标签: 杂谈 分类: linux 首先, 我会说不保证你在使用者模式 ( ...

  9. c++ 普通高精除高精

    //codevs3118 高精度练习之除法 //打出了高精除高精,内心有点小激动. //还记得已开始学的时候非常难打 #include<cstdio>#include<cstring ...

随机推荐

  1. oracle 认识

    有一家叫甲骨文的粮店,老板很严谨,为了防止仓库的粮食在买入卖出的时候发生问题,他制订一套流程,首先进出仓库的每一旦粮食都要求有一个编号(SCN),而且出入库之前必须先放到一个平台上(buffer ca ...

  2. 实现一个简单版的express

    express应该算是早期最优秀的一个node框架了,刚开始学node做后端语言就是用的express,它的cli可以帮我们搭建好项目目录,就像现在的vue,react一样.express本身没有做太 ...

  3. java.sql.Date java.sql.Time java.sql.Timestamp 之比较

    java.sql.Date,java.sql.Time和java.sql.Timestamp 三个都是java.util.Date的子类(包装类). java.sql.Date是java.util.D ...

  4. python3.x 编码问题

  5. 【转】Linux学习(1)-常用快捷键、文件管理和查询

    原文链接:http://www.cnblogs.com/zhaopei/p/7397402.html 有话要说 为什么要用Linux?要用Linux的原因太多,想说说不完啊. 如果你说用Linux只是 ...

  6. liunx运维必备150个基础命令

    经过上次的面试,总结了一下的linux系统常用命令: 命令 功能说明 线上查询及帮助命令(2个) man 查看命令帮助,命令的词典,更复杂的还有info,但不常用. help 查看Linux内置命令的 ...

  7. 九度OJ--Q1163

    import java.util.ArrayList;import java.util.Scanner; /* * 题目描述: * 输入一个整数n(2<=n<=10000),要求输出所有从 ...

  8. AM5728通过GPMC接口与FPGA高速数据通信实现

    硬件:AM5728开发板:Artix-7开发板软件:Linux am57xx-evm 4.4.19:Vivado 2015.2作者:杭州矢志信息科技有限公司邮箱:admin@sysjoint.com ...

  9. 软件工程项目组Z.XML会议记录 2013/09/14

    软件工程项目组Z.XML会议记录 [例会时间]2013年9月14日星期六21:00-22:30 [例会形式]小组讨论 [例会地点]新主楼A1025 [例会主持]李孟 [会议记录]李孟 会议整体流程 一 ...

  10. mysql初识(5)

    将mysql数据库内的表导出为execel格式文件: 方法1:mysql命令:select * into outfile '/tmp/test.xls' from table_name;(需要注意的是 ...