Wolfram Alpha / Wolfram Script を競プロで使おう!

注意

本記事には ABC154-F および エイシンプログラミングコンテスト2020-F のネタバレが含まれます

本題

皆さん、 Woflram Alpha を使ったことはありますか? 私はあります。

さて、Wolfram Alpha だと入力長制限や実行時間制限で計算できないことがあって若干煩わしいですよね。

なぜか計算してくれない

そこで手元実行でそのようなことを気にせず使える Wolfram Script を導入しましょう!

そこまで難しい手順でもないので導入は公式に譲ります。 reference.wolfram.com

実際に使ってみる

ABC154-F Many Many Paths

問題概要

正整数  L_1, L_2 \ (1 \leq L_1 \leq L_2 \leq 10^{6}) および  R_1, R_2 \ (1 \leq R_1, R_2  \leq 10^{6}) が与えられるので、  \sum_{l=L_1}^{L_2} \sum_{r=R_1}^{R_2} \binom{l+r}{r}  \mathrm{mod} \ (10^{9}+7) で求めてください。

解法

とりあえずそのまま式を入力してみます、すると

実行の様子
事前計算のもと  O(1) で解ける式を教えてくれます!

これを愚直に実装して AC を得られます。

エイシンプログラミングコンテスト2020-F Two Snuke

問題概要

次の問題を  T \ (1 \leq T \leq 100) 個の与えられるケースについて解いてください。

正整数  N  \ (1 \leq N \leq 10^{9}) が与えられるので、 0 \leq A_{2i} \lt A_{2i+1} \ (0 \leq i \leq 4) かつ  \sum_{i=0}^{9} A_i \leq Nを満たすようなすべての長さ  10 の数列  A について、 それぞれ  \prod_{i=0}^{4} (A_{2i+1} - A_{2i}) を計算し、その総和を  \mathrm{mod} \ (10^{9}+7) で求めてください。

解法

FPS による考察を用います。

まず立式することを考えると、これは積の和典型のような形をしていますから

 \displaystyle
f = \sum_{i=0}^{\infty} \sum_{j=0}^{i-1} (i-j)x^{i+j}

と定めれば、

 \displaystyle
\sum_{i=0}^{N} [x^{i}] f^{5} = [x^N]\frac{f^{5}}{1-x}

が求めるべき答えであることは明らかです、ここで  f を具体的に計算すればあとは Bostan-Mori で殴って終わりそうですので、これを Wolfram に投げつけます。

若干数式が見づらい

と求めてくれたので、

 \displaystyle
[x^N]\frac{f^{5}}{1-x} = [x^N] \frac{x^{5}}{(1-x)^{16}(1+x)^{5}}

と分かりました、よって答えは  O(T\log{N}) で計算できて十分高速に動作し、 AC を得られます。

おまけ

先ほど解いた Two Snuke は  O(T) 解法もあるのですが、それも Wolfram で導出できます。

今、 求めたい値は  [x^{N}] \frac{x^{5}}{(1-x)^{16}(1+x)^{5}} であることがわかっていて、これは  [x^{N-5}] \frac{1}{(1-x)^{16}(1+x)^{5}} に等しいですから、これを考えます。

Wolfram 言語で SeriesCoefficient[1/(1-x)^16 1/(1+x)^5,{x,0,n}] と書くと  [x^{N}] \frac{1}{(1-x)^{16}(1+x)^{5}} を表せるので、これをターミナルに入力すると超長い式が返ってきます。

ながい

一旦 FullSimplify[%] と入力することでこの式を簡約化して

% を一つ前の出力として扱えます

Piecewise (条件分岐用の関数) が邪魔なので InputForm[%] を入力してキーボードで打てる一般的な形にしてから中身をコピーして

その中身も長くて扱いにくいので一度入力して % として扱えるようにしてから、PolynomialMod[%,10^9+7] を入力して剰余をとって

さらにもう一度 InputForm[%] で整えて

いい感じの式を得られました。

あとは Vscode などの置換機能で (スペースと+) を %mod などに置き換えるとコピペで使えるようになります。

実際にほぼコピペで AC したコード: atcoder.jp