#ySybttg060306. 1630:SuperGCD
1630:SuperGCD
No testdata at current.
1630:SuperGCD
题目描述
Sheng Bill 有着惊人的心算能力,甚至能用大脑计算出两个巨大的数的 GCD(最大公约数)!因此他经常和别人比赛计算 GCD。有一天 Sheng Bill 很嚣张地找到了你,并要求和你比赛,但是输给 Sheng Bill 岂不是很丢脸!所以你决定写一个程序来教训他。
输入格式
输入共两行,第一行一个数 ,第二行一个数 。
输出格式
一行,表示 和 的最大公约数。
样例
样例输入 #1
12
54
样例输出 #1
6
样例解释 #1
。
数据范围
对于全部数据,。
时空限制
- 时间限制:1000 ms
- 内存限制:524288 KB
注意:本题中 是超大整数(可达 位十进制数),因此必须使用高精度计算最大公约数。可以使用二进制 GCD 算法(Stein算法),因为它只涉及减法和移位,避免了大数取模运算。
二进制 GCD 算法步骤(对于高精度数):
- 如果 ,则 。
- 如果 和 都是偶数,则 。
- 如果 是偶数, 是奇数,则 。
- 如果 是奇数, 是偶数,则 。
- 如果 和 都是奇数,则 。
需要实现高精度数的以下操作:
- 判断奇偶性:只需看最低位是否为偶数。
- 除以 :高精度右移一位(即除以 取整)。
- 比较大小:高精度比较。
- 减法:高精度减法。
- 乘法(乘以 ):实际上我们不需要乘以 ,而是记录因子 的个数 ,最后将结果左移 位(即乘以 )。
算法流程:
- 初始化 。
- 当 时:
- 如果 和 都是偶数,则 ,,。
- 否则如果 是偶数,则 。
- 否则如果 是偶数,则 。
- 否则(都是奇数),如果 ,则 ,否则 。
- 最后结果为 (或 ,因为此时 )。
由于 可达 位,减法操作可能使得数值减小较慢,但每次操作都会减少数的规模(除以 或减法),因此总的操作次数不会太多(大约 次)。但高精度运算本身复杂度与位数相关,总时间复杂度可以接受。
注意:输入的数可能很大,需要用字符串读入,并转换为高精度表示(例如用数组存储十进制位,或存储二进制位)。为了方便除以 ,可以用十进制存储,除以 时从高位到低位逐位计算。也可以将数转换为二进制表示(大整数转二进制),然后直接进行二进制操作,但转换可能较复杂。
由于数据规模较大,需要仔细实现高精度运算,并注意优化常数。