AtCoder

ABC340 F問題(S = 1)を解く

AtCoder_ABC340_F

AtCoder が提供しているABC(AtCoder Beginner Contest)340 のF問題をC++とPythonで解いてみました。ABC340は、2024年2月10日21:00に実施されました。

AtCoder の紹介はこちらに、プログラミングの方針はこちらに記事があります。

F問題 S = 1(Difficulty : 1516)

問題はリンク先をご覧ください。

ABC340 F問題 S = 1

拡張ユークリッドの互除法を使います。AtCoder Problems による Difficulty は 1516 でした。

解答案

(0, 0)、(A, B), (X, Y) を頂点とする三角形の面積は、

$$\frac{|A X\; – \;B Y|}{2}$$

となります。面積が1となるため、$|A X\; – \;B Y| = 2$ となります。前回に紹介した拡張ユークリッドの互除法を使います。

C++ プログラム例(ABC340F)

自前ライブラリ関数 extgcd を呼び出し不定一次方程式の解を求めます。最大公約数が1となる場合と2になる場合と3以上の場合(解なし)に分けて、解を出力しました。

以下が、C++プログラムとなります。

#include <bits/stdc++.h>
using namespace std;

typedef long long int ll;

ll extgcd(ll a, ll b, ll& x, ll& y)
{
	ll d = a;

	if (b != 0) {
		d = extgcd(b, a % b, y, x);
		y -= (a / b) * x;
	} else {
		x = 1;
		y = 0;
	}

	if (d < 0) {
		d = -d;
	}

	return d;
}

int main()
{
	ll x, y;
	cin >> x >> y;

	ll a, b;
	ll d = extgcd(y, -x, a, b);

	if (d == 1) {
		cout << 2 * a << " " << 2 * b << endl;
	} else if (d == 2) {
		cout << a << " " << b << endl;
	} else {
		cout << -1 << endl;
	}

	return 0;
}

AC(Accepted=正しいプログラム)と判定されました。

Python プログラム例(ABC340F)

Python 版も基本的な考え方は同じです。以下となります。

"""AtCoder Beginner Contest 340 F"""


def extgcd(a, b):
    d = a

    if b != 0:
        d, y, x = extgcd(b, a % b)
        y -= (a // b) * x
    else:
        x, y = 1, 0

    return (abs(d), x, y)


x, y = map(int, input().split())
d, a, b = extgcd(y, -x)

if d == 1:
    print(2 * a, 2 * b)
elif d == 2:
    print(a, b)
else:
    print(-1)

こちらも「AC」と判定されました。

最後に

この問題を調べることによって、不定一次方程式の解き方と、拡張ユークリッドの互除法を学ぶことができました。

引き続き ABC の問題を紹介していきます。

COMMENT

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA