ABC114

A - 753

なんかうまい書き方があるか一瞬考えたけど、単に書いて時間はかからないのでそれで。

B - 754

またルンルンが出てくる。あのときのwriter誰だっけ?

やるだけ。文字列を数値にする方法を思い出そうとかと一瞬思ったが、単に書けばスピードが出せる。ここはいい動きができた。

C - 755

ちいさな計算量でできる方法もありそうだが、3^9でGoogle検索して19683と小さいので、10^9未満(10^9は七五三数でないため)の七五三数を全列挙する方針にした。桁数で分けて、k桁なら3^k(この計算はpowを使った)回ループして、k桁の数を構成しvectorにpush_back。forのネストが何個か最初は見えてないので頭を使う。列挙したらソートと思っていたが、よく考えたらN以下のものが何個あるか単に数えればいい。解いてる途中で「1回以上現れる」という条件を忘れたが、修正すれば通った。

D - 756

N!の約数のうち約数をちょうど75個持つ正整数の個数を求めろという問題。「約数」が2回出てくるので意味を把握しにくい。N!が都合のいい特徴のありそうな数じゃないので、とっかかりがない。とりあえず単に七五数かの判定を考える。75=3*5^2(最初5で割って15*5にまず分解してしまったが75が25の倍数に見えない文脈ってあるんだね)。素因数分解したときに、例えば素数が3個出てきてp0^2*p1^4*p2^4とかなってれば約数は75個になる。他にもあって、全部でたぶん 4,4,2 24,2 14,4 74 の4つ。これを手動でソースコードに入れさせる問題なのがちょっと嫌な感じだ。100!の扱いは、わからんけどとりあえずN!を素因数分解するんじゃないかと思って実装した。既に10分くらい過ぎてて更に5分くらいかかったけど。それでもわからない。うんうんうなる。まさか解けないなんてことは。このころのことはよく覚えていない。とにかく解法がわかった。N!に各素因数が何個あるかの配列aから、各hについてh以上のa[j]が何個あるかの配列bを作る。そしてb[74]とか書く。4,4,2のパターンが心配だが、他の3つのケースを書いていく。組合せの重複を除くのが大変だったが、なんとか全部行けそう。しかし微妙に合わない。ここからデバッグ地獄だった。合ってるはずなのにサンプルが合わず、バグは全く見つからない。永遠とも思える時間が流れ、24,2を24,4で書いてることに気づいた。14,4からコピペして14のほうだけ直せばいいと思い込んでいたのだ。見た目もきれいだから気づかない。さて、ここを直してもサンプルは合わない(今回は全体的にサンプルが親切でそれでも難しいといういいセットだったね)。9だけずれてるので、6と3を見つけて/2を消すという普通のデバッグができる。2つの素因数は区別されるから割る必要がなかった。理解の浅い最初のころに書いたコードだ。提出してAC。1時間近くかかったABCは相当久しぶりじゃないか。

デバッグ力というか、この特殊な計算をバグらせにくく書く技術がなかった。そのバグを取り除いたうえでも組合せの間違いがあったが、これは、状況がまあまあわかっていても言語化しにくいゆえのミス。とにかく、b[24]とか調子に乗って書いて、そこをバグがわかるように書く技術もないのに自覚せず、ただ長時間悩むだけになった、それがよくない。