AtCoder

ABC319 B問題(Measure)を解く

AtCoder_ABC319_B

AtCoder が提供しているABC(AtCoder Beginner Contest)319 のB問題をC++とPythonで解いてみました。ABC319は、2023年9月9日21:00に実施されました。

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

B問題 Measure(Difficulty : 70)

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

ABC319 B問題 Measure

問題文で記載されている通りに操作をプログラムしました。AtCoder Problems による Difficulty は 70 でした。

解答案

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

与えられた操作は以下となります。

  • 1以上9以下の $N$ の約数 $j$ を求めておきます。具体的には、div[j] が true となる $j$ が約数となります。
  • $0 \leqq i \leqq N$ の範囲の $i$ に対して、以下を行います。
    • div[j] が true となる $j$ を候補として、$i$ が $N / j$ で割り切れる最小の $j$ を求めます。その $j$ を出力します。
    • 上記のような $j$ が無い場合は、’-‘ を出力します。

上記の操作を C++として変換したものが以下となります。

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

int main()
{
	int n;
	cin >> n;

	vector<bool> div(10, false);
	for (int i = 1; i <= 9; ++i) {
		if (n % i == 0) {
			div[i] = true;
		}
	}

	string result = "";
	for (int i = 0; i <= n; ++i) {
		int mt = 10;
		for (int j = 1; j <= 9; ++j) {
			if ((div[j])&&(i % (n / j) == 0)) {
				mt = min(mt, j);
			}
		}
		if (mt == 10) {
			result += '-';
		} else {
			result += mt + '0';
		}
	}

	cout << result << endl;

	return 0;
}

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

Python プログラム例(ABC319B)

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

"""AtCoder Beginner Contest 319 B"""
n = int(input())
div = [False] * 10
for i in range(1, 10):
    if n % i == 0:
        div[i] = True

result = ""
for i in range(n + 1):
    mt = 10
    for j in range(1, 10):
        if div[j] and i % (n // j) == 0:
            mt = min(mt, j)
    if mt == 10:
        result += '-'
    else:
        result += str(mt)

print(result)

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

最後に

この問題は、読むだけでは意図が読み取れませんでした。入力例1と出力例1から操作を理解して、プログラムとして復元しました。

問題が読み取りにくいという意見がネットに出ていましたが、問題としては、well-defined に書けていると考えています。

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

COMMENT

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

CAPTCHA