Wolfram Alpha / Wolfram Script を競プロで使おう!
注意
本記事には ABC154-F および エイシングプログラミングコンテスト2020-F のネタバレが含まれます。
本題
皆さん、 Woflram Alpha を使ったことはありますか? 私はあります。
さて、Wolfram Alpha だと入力長制限や実行時間制限で計算できないことがあって若干煩わしいですよね。
そこで手元実行でそのようなことを気にせず使える Wolfram Script を導入しましょう!
そこまで難しい手順でもないので導入は公式に譲ります。 reference.wolfram.com
実際に使ってみる
ABC154-F Many Many Paths
問題概要
正整数 および が与えられるので、 を で求めてください。
解法
とりあえずそのまま式を入力してみます、すると 事前計算のもと で解ける式を教えてくれます!
これを愚直に実装して AC を得られます。
エイシングプログラミングコンテスト2020-F Two Snuke
問題概要
次の問題を 個の与えられるケースについて解いてください。
正整数 が与えられるので、 かつ を満たすようなすべての長さ の数列 について、 それぞれ を計算し、その総和を で求めてください。
解法
FPS による考察を用います。
まず立式することを考えると、これは積の和典型のような形をしていますから
と定めれば、
が求めるべき答えであることは明らかです、ここで を具体的に計算すればあとは Bostan-Mori で殴って終わりそうですので、これを Wolfram に投げつけます。
と求めてくれたので、
と分かりました、よって答えは で計算できて十分高速に動作し、 AC を得られます。
おまけ
先ほど解いた Two Snuke は 解法もあるのですが、それも Wolfram で導出できます。
今、 求めたい値は であることがわかっていて、これは に等しいですから、これを考えます。
Wolfram 言語で SeriesCoefficient[1/(1-x)^16 1/(1+x)^5,{x,0,n}]
と書くと を表せるので、これをターミナルに入力すると超長い式が返ってきます。
一旦 FullSimplify[%]
と入力することでこの式を簡約化して
Piecewise
(条件分岐用の関数) が邪魔なので InputForm[%]
を入力してキーボードで打てる一般的な形にしてから中身をコピーして
その中身も長くて扱いにくいので一度入力して %
として扱えるようにしてから、PolynomialMod[%,10^9+7]
を入力して剰余をとって
さらにもう一度 InputForm[%]
で整えて
いい感じの式を得られました。
あとは Vscode などの置換機能で (スペースと+) を %mod
などに置き換えるとコピペで使えるようになります。
実際にほぼコピペで AC したコード: atcoder.jp