Codeforces Round #730 (Div. 2) A. Exciting Bets(同余)

Posted issue是fw

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces Round #730 (Div. 2) A. Exciting Bets(同余)相关的知识,希望对你有一定的参考价值。

LINK

先假设有最大值为 k k k,为了达到最大值每个数都加了 x x x,且 a > b a>b a>b

满足 s 1 k = a + x & & s 2 k = b + x s_1k=a+x\\&\\&s_2k=b+x s1k=a+x&&s2k=b+x

从式子中可以看出只要 a , b a,b a,b k k k同余就存在合法的 x x x满足要求

于是我们找到最大的 k k k使得 a % k = b % k a\\%k=b\\%k a%k=b%k即可

那么只需要枚举 z = a − b z=a-b z=ab的因子作为 k k k即可

直接枚举复杂度是 O ( a b s ( a − b ) ) O(\\sqrt{abs(a-b))} O(abs(ab))

然而我们发现 a % ( a − b ) = b % ( a − b ) a\\%(a-b)=b\\%(a-b) a%(ab)=b%(ab),因为 a , b a,b a,b本身也只相差 a − b a-b ab而已啊…

于是取 k = a − b k=a-b k=ab就是最大值,判断一下是一直做减法划算还是一直做加法划算即可

特判 a = = b a==b a==b

#include <bits/stdc++.h>
using namespace std;
#define int long long
int t,n,m;
signed main()
{
	cin >> t;
	while( t-- )
	{
		cin >> n >> m;
		if( n<m )	swap( n,m );
		if( n==m )	cout << "0 0\\n";
		else
		{
			int k = n-m;
			int yu = n%k;
			int mi = min( n%k,k-n%k );
			cout << k << " " << mi << endl;
		}
	}
}

以上是关于Codeforces Round #730 (Div. 2) A. Exciting Bets(同余)的主要内容,如果未能解决你的问题,请参考以下文章

Codeforces Round #730 div.2 A-E题解

Codeforces Round #730 (Div. 2) A. Exciting Bets(同余)

Codeforces Round #730 (Div. 2) C. Need for Pink Slips(概率,模拟....)

Codeforces Round #730 (Div. 2) D. RPD and Rap Sheet (交互,从easy到hard)

Codeforces Round #436 E. Fire(背包dp+输出路径)

[ACM]Codeforces Round #534 (Div. 2)