と重めだが高度な fps を用いない方法。
問題概要
について、以下を満たす長さ の数列 の個数を求めよ。
解法
に を足して、 と言い換えておきます。また、 の時の答えを と表記します。
ここで、 かつ を満たす の個数を とおくことにして、 とすると、 が成り立ちます。(これは ABC288Ex の解説とかで触れられてると思います)よって、 を求めることができればよいです。
今後、以下が成り立つことを利用します。( が偶数の場合未証明、実験で導きました)
- かつ を満たす の個数を とおくと、
- が奇数の場合、 は一様分布。
- が偶数の場合、 は を除いて一様分布。また、 が成り立つ。
KUPC2017K の 別解 と同じように、上の桁から考察していきます。いま 桁目を見ているとします。 ともに 桁目が ならば 桁目に移ります。 のみが ならば答えは です。 の 桁目が とします。
ここで、 の 桁目について考察します。 が連続したあと が( の 桁目が なら奇数個、そうでないなら偶数個)連続する形になります。ここで、前半の が連続する部分の下の桁は の値を一様に取れることが重要で、もし の連続する個数が奇数ならこの時点で答えがわかります(上の桁が である部分が何であろうと関係なくなるので)。また、 の連続する個数が偶数の場合も、 XOR が である場合以外は一様ですから、一様として答えを求めた後、 の長さを として、 についての問題の答えを用いて「補正」をしてあげればよいです。ここで、持つべき必要がある状態を考えると、「 の時の答え」のみであり、 が小さいほうから計算していくことができます。状態遷移が畳み込みの形になっていることに気を付けると、 でこの問題が解けます。