問題に与えられた条件を,集合 が『連続する自然数を要素として持たない』 と言い換えると,より考察が進めやすくなるかもしれません.
について 以上 以下の正整数の集合に含まれる,ある部分集合が を満たすとき,それを -valid な集合と呼びます.
-valid な集合が何通りあるかを求めることがこの問題のゴールです.
において -valid な集合を構成するとき, -valid な集合に加えて,新たに正整数 を用いることができます.
について -valid な集合のうち,正整数 を挿入すると -valid な集合になるものを -completed な集合と呼ぶとすると, -valid な集合の個数に -completed な集合の個数を足したものが,求めるべき答えです.
-completed な集合が満たす条件を考えてみましょう.新たに正整数 を挿入してもなお を満たさなければなりませんから,要素として正整数 を持つことはできません.
また, を要素として持たないような -valid な集合ならば,必ず -completed な集合である条件を満たします.
結果的に,この条件は -valid な集合が満たす条件と一致します.
したがって, において -valid な集合の個数は, -valid な集合の個数と -valid な集合の個数とを足し合わせたものになります.
-valid な集合と -valid な集合はそれぞれ 通り, 通りとあるので,再帰的に計算を行うことで任意の について答えを求めることができました.
これは,動的計画法などの適切なアルゴリズムを用いることで十分高速に計算することが可能です.
で割った余りを出力することに注意してください.
実装例