ABC114 参加記録&解説
CもDも手間取ってしまい54位…
A - 753
解法
ifや3項演算子などで場合分けしましょう。
ACコード
- (Ruby)Submission #3700911 - AtCoder Beginner Contest 114
- (C++)Submission #3708253 - AtCoder Beginner Contest 114
B - 754
解法
の長さが短いので、全部試すことができます。文字列から数値への変換は、C++だと stoi
などを使うと便利です。
ACコード
- (Ruby)Submission #3702096 - AtCoder Beginner Contest 114
- (C++)Submission #3708303 - AtCoder Beginner Contest 114
C - 755
解法
こういう問題形式を見ると桁DPと思ってしまうのですが、まあ300点問題でそれはないですね…
なので、 以下の全ての整数を調べることはできません。ただ、 のみで構成される整数に絞ると候補がぐっと少なくなります。
桁数が で からなる整数は 個あります。候補となる値の桁数は が最も大きいときで3~9桁なので、 個、計算すると 個しかありません。これは全探索できますね。
実装においてはまず桁数 を1つずつ見ていって、それぞれの整数列挙には3進数を用いるとよいです。候補を全て列挙して、「 以下か?」「 が全て使われているか?」をチェックすればよいです。
ACコード
- (Ruby)Submission #3704123 - AtCoder Beginner Contest 114
- (C++)Submission #3708007 - AtCoder Beginner Contest 114
3進数の実装について少し補足します。コード中で trits
という変数で書いているのが3進数の値で、列挙される整数( からなる 桁の整数)と1対1対応しています。3進数の各桁の が にそれぞれ対応します(int arr[3] = {3, 5, 7};
で表現しています)。
例えば で のとき、 であることからこれは3進数表記すると 210
であり、この値は に対応しています。(桁数が違うと同じ3進数の値でも対応する整数が異なるので注意してください)
D - 756
解法
正整数の約数の個数は、その値の素因数分解と密接に関わっています(参考リンク)。具体的には素因数ごとに個数を数えて、その個数が 個、 個、... 個だったとすると、約数の個数は 個になります。
ということで、まずは を素因数分解してしまいましょう。 なのでそんなに多くの素因数は登場しません。2から最大で97まで、それぞれの素因数ごとに何個含まれているかが計算できます。
小さいほうから 番目の素因数 の個数を と書くことにします。例えば小さい値 で考えると、 は以下のように素因数分解できます。
1 | 2 | 3 |
2 | 3 | 1 |
3 | 5 | 1 |
の約数は、これらの素因数 それぞれについて「 0個以上 個以下の範囲で、いくつ取るか」を考え、その素因数を全て掛け合わせたものになります。各素因数についての「いくつ取るか」の取り方の組1つが、約数1つに対応します。例えば先程の の例において、「2を2個、3を0個、5を1個」取るとすれば、これは120の約数20に対応します。この20の約数の個数は 個です。
ということで、各素因数ごとに順番にいくつ取るかを考えていく数え上げDPができます。 を「 番目の素因数まで見た時に、それまでの約数の個数が であるような選び方の個数」とします。このとき は75の約数だけを考えれば十分です。
遷移は以下のようになります。 番目の素因数まででできた約数が 個で、 番目の素因数を 個選ぶ、という選び方に対応しています。
- 75の約数 について、 であれば を に加算する。
これを最後まで計算し、素因数の種類数を として が答えです。