yukicoder No.420 mod2漸化式
最近はyukicoderの低難易度埋めてます.
その中でもおもしろいと思ったものを書き留めます.
解法
まず漸化式
がそもそも何を表しているか考えます.
ためしにいろいろ入れてみると,
...
となります. のべきがとなっているところや, 数字の増え方をみると, この漸化式は(というより関数としてみると)あるを進数表現したときの立つ1の数, または各桁の和であると推測することができます. その観点を持って漸化式を見ると, たしかにそれらしいことがわかります.
問題に戻ります. 問題では, あるが与えられ,
- となるようなの数
- それを満たすの和
の2つを求める必要があります. 上の考察より, 前者は31ビット分の中に1を個立てる場合の数を求めればよいです. これは, で求まります.
後者は少し考察が必要です. 上で求めたの中で, 番目のビットにが立つ場合の数はいくらか?を考えます. この数は, ビット目に1を立てておいて他の場所に個1を立てたときの場合の数に対応するので, に対応します.
よって, ビット目に1が立つものは 個あり, このを1から30について計算するので,
となります. コンビネーションの部分は外に出せ,
となり, さらに簡略化すると,
となり, これが和の方の答えです.
しかし, が0のときだけ場合分けが必要なので注意です.
感想
漸化式の意味を理解すると大きく計算量を減らすことができる面白い問題だと思いました.