您的位置:首页 > 其它

bzoj 1876 [SDOI2009]SuperGCD

2016-08-15 16:11 169 查看
Description

Sheng bill有着惊人的心算能力,甚至能用大脑计算出两个巨大的数的GCD(最大公约 数)!因此他经常和别人比赛计算GCD。有一天Sheng bill很嚣张地找到了你,并要求和你比 赛,但是输给Sheng bill岂不是很丢脸!所以你决定写一个程序来教训他。

Input

共两行: 第一行:一个数A。 第二行:一个数B。

Output

一行,表示A和B的最大公约数。

Sample Input

12

54

Sample Output

6

HINT

对于20%的数据,0 < A , B ≤ 10 ^ 18。

对于100%的数据,0 < A , B ≤ 10 ^ 10000。

10^10000让常用的辗转相除无用武之地。其实求gcd还有另一种方法:更相减损术

第一步:任意给定两个正整数;判断它们是否都是偶数。若是,则用2约简;若不是则执行第二步。

第二步:以较大的数减较小的数,接着把所得的差与较小的数比较,并以大数减小数。继续这个操作,直到所得的减数和差相等为止。

则第一步中约掉的若干个2与第二步中等数的乘积就是所求的最大公约数。

求gcd(260,104)

由于260和104均为偶数,首先用2约简得到130和52,再用2约简得到65和26。

此时65是奇数而26不是奇数,故把65和26 辗转相减:

65-26=39

39-26=13

26-13=13

所以,260与104的 最大公约数等于13乘以第一步中约掉的两个2,即13*2*2=52。

这样的时间复杂度是O(n)的,因为平时大多只需考虑正常范围的数,以及多组询问的要求,所以这种依靠减法的求gcd方式一直没有出现。

正解就是写个高精度的事情啦。

python大法好

a=(int)(input())
b=(int)(input())
while b!=0:
t=a
a=b
b=t%b
print(a)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: