题中的两种操作,本质就是辗转相减法:每次用较大的数减去较小的数(写成 (a,b−a) 或先交换再减)。反复操作后,两个数都会变成它们的最大公约数 gcd(a,b),此时偏差 ∣a−b∣=0。
因此 n 个数对操作到最后,最小偏差之和恒为 0。问题转化为:每个数对最少多少步才能变成 (gcd,gcd)。
直接模拟减法在 a 远大于 b 时太慢,改用取模加速:
定义数对 (a,b) 的偏差为 ∣a−b∣。可以对一个数对执行如下操作任意次(也可以不操作):将其变为 (a,b−a),或变为 (b,a−b)。
现有 n 个数对。请对它们分别进行若干次操作,使得所有数对的偏差之和最小;在偏差之和已经最小的前提下,使操作次数之和也最小。
输出最小偏差之和,以及对应的最少操作次数。
数对个数不超过 10^5。每个数对的两个分量均为不超过 10^9 的正整数。
By signing up a CodeFun2000 universal account, you can submit code and join discussions in all online judging services provided by us.