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の約数
について、
であれば
を
に加算する。
これを最後まで計算し、素因数の種類数を として
が答えです。