ABC114 D - 756
初めに思いついたこと:
・100!を愚直に扱うのはまずい。(150桁くらいある)
・約数の個数なので、素因数分解した値を考えれば良さそう。
(この時、100!を素因数分解しても、素因数の個数は(2^10)^50≒10^150よりせいぜい500くらい。(余裕で扱える))
・N!=2^p2*3^p3*5^p5....の時、約数の個数は(p2+1)*(p3+1)*(p5+1)....となるのでこれを使えば約数75個の条件もチェックできる。
具体的には:
約数の個数が75=3*5*5=15*5=3*25のとき、条件を満たす数はa^74またはa^2*b^4*c^4またはa^14*b4またはa^2*b^24のいずれかで表される。
よって、N!の素因数の個数をカウントしておけば、~乗になりうるかどうかがそれぞれ判定でき、素因数全体について全探索をすれば答えが求まる。
(素因数の種類はたかだか100、なぜなら101以上の素数は100!と互いに素である)
素因数の個数のカウントの仕方は、2~Nをそれぞれ素因数分解して、足し合わせていくだけ。
注意点:
a^4*b^4*c^2のとき、a<bなどの条件をつけてあげないと重複して数え上げてしまう。
私は条件の付け方を、for(i=2~){for(j=i+1~)}}のようにjについて、j=i+1スタートにした。
また、a,b,c(あるいはa,b)について、a==b||b==c||c==a == true にならないように気を付けたい。明らかに条件が成立しなくなる。
例)2^4*3^4*2^2=2^8*3^4 -> 9*5=45個 X
実装:
本番ではa^4*b^4*c^2の場合しか考えていなかった。
全体的に悔しいコンテストでした。
精進します。
ABC114 C - 755
初めに思ったこと:
・全探索は難しそう。O(N)=10^9
・桁DPかな?
・ずるずると桁DPの沼にハマる
コンテスト後:
bit全探索を思いつく。
具体的には、3,5,7を0,1,2に対応させてbit全探索。
計算量はO(10*10*3^10)≒10^6で、間に合う。
注意点:
・桁それぞれについてbit全探索する必要がある。
実装例:
悔しいです。
補足
再帰関数でもできるそうなので、そちらのコードも載せておきます。
なお、引数のx3~x7は必要ありませんが(nから判別できるため)、書いた方が楽です。
こっちの方が簡潔で美しいですね。
ブログをはじめました。
競技プログラミングの解説ブログを書いてみることにしました。
私はプログラミングを知らない状態で競プロを始めた人間です。
なので、プログラミング未経験者の方々が競プロを始めたときに、私の軌跡を参考にできるようなブログが書けたらなと思います。
あまり気構えると飽きてしまう性分なので、徒然なるままに書いていきたい。