BZOJ 1876 [SDOI2009] SuperGcd | PY好题

题面就是让你求两个超级大整数,求GCD


题解:

题目本意应该是出题人想考考高精度取膜

但是可以通过一种神奇的Stein算法来做

由J. Stein 1961年提出的Stein算法很好的解决了欧几里德算法中的这个缺陷,Stein算法只有整数的移位和加减法,为了说明Stein算法的正确性,首先必须注意到以下结论:
gcd(a,a)=a,也就是一个数和其自身的公约数仍是其自身。
gcd(ka,kb)=k gcd(a,b),也就是最大公约数运算和倍乘运算可以交换。特殊地,当k=2时,说明两个偶数的最大公约数必然能被2整除。
当k与b互为质数,gcd(ka,b)=gcd(a,b),也就是约掉两个数中只有其中一个含有的因子不影响最大公约数。特殊地,当k=2时,说明计算一个偶数和一个奇数的最大公约数时,可以先将偶数除以2。
----摘自百度百科
所以当这两个数都是2的倍数的时候,累乘器++,都除以2
如果任意一个是2的倍数,除以2,然后更相减损即可
答案是 结果*(1<<累乘器)
 
当然,可以用PYTHONac这道题
1 a,b=input(),input()
2 c=a%b
3 while c!=0L:
4     a=b
5     b=c
6     c=a%b
7 print b
原文地址:https://www.cnblogs.com/mrsheep/p/7911049.html