AtCoder が提供しているABC(AtCoder Beginner Contest)319 のB問題をC++とPythonで解いてみました。ABC319は、2023年9月9日21:00に実施されました。
AtCoder の紹介はこちらに、プログラミングの方針はこちらに記事があります。
B問題 Measure(Difficulty : 70)
問題はリンク先をご覧ください。
問題文で記載されている通りに操作をプログラムしました。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 の問題を紹介していきます。