PoC(Project orangekid Contest) は、 Project Euler のように、競技プログラミングで数学の問題を解くコンテストです。
次のような問題です。
長さ $r$ の非負整数の数列 $\{a_n\}$ は,次を満たします.
・$2\leq r\leq10^6$
・$a_1=2,a_r=0$
・$2\leq i \leq r$ なる $i$ について, $a_i-a_{i-1}=\pm1$
このような $\{a_n\}$ はいくつありますか.
正しくは$2\leq r\leq10^6+1$です。本当に申し訳ございません。
まず考えられるのはDP(動的計画法)ですが、この範囲だと明らかに間に合いませんね。実際に小さい方から実験して、法則を探してみましょう。
横軸を$i$、縦軸を$a_i$として$xy$平面上にありうる点をプロットすると、図1のようになります。
$r=13$の場合
この図から、$r$が偶数の時、条件を満たす数列がないことが容易にわかります。そこで、長さが$r$($r$は3以上の奇数)のときの、条件を満たす数列の数を$P_n$と置きましょう。図1を回転させると、次の図2を得ます。
回転後
$P_n$はこの図の左下端から右上端まで、最短距離で移動する方法の数に等しいですね。
ここで、次の図3について考えてみましょう。
この図形の左下端から右上端まで、最短距離で移動する方法の数は、カタラン数を用いて求めることが出来ます。
$n$番目のカタラン数$C_n$は、$C_n=\frac{_{2n}C_n}{n+1}$と定義される。
$xy$平面上の点$(0,0)$から点$(n,n)$まで$x\geq y$を満たしながら最短距離で移動する方法は$C_n$通りある。
証明はネットに転がっているので各自で調べてください。
したがって、図3の場合は$C_7$通りあることになります。
また、図3の左下端から右上端まで行く方法は、次の2パターンに分けられます。
2パターン
図4より、パターン1のときは$C_6$通り、パターン2のときは$P_{13}$通りあることが分かりますね。したがって、
$P_{13}=C_7-C_6$
と表すことが出来ます。
$r$の値が違う場合も同様に考えていくと、求める値($=P_n$の総和)は、
$$
\sum_{i=1}^{5\times 10^5}(C_{i+1}-C_i)=C_{5\times10^5+1}-C_1
$$
となるので、後は計算すればよいです。modで割り算は扱いにくいですが、$998244353$は素数なので、$a^{998244353-2}$が$a$の$\mod 998244353$での逆元(逆数に対応する)になります。以上をプログラムすると、答は$122657580$と求まります。
mod = 998244353
N = 500001
a, b = 1, 1
for i in range(1, N + 1):
a = a * (i + N) % mod
b = b * i % mod
b = pow(b * (N + 1), mod - 2, mod)
ans = a * b - 1
print(ans % mod)