形式的冪級数を用いた解法について書きます.もっと高速な解法もあるようですが,わかんないです. maspyさんに教えていただきました.この記事の最後で説明しています.
問題概要
の分割数をそれぞれ求めてください.
分割数について
分割数は,総和が である正の整数の多重集合の個数といえます.もうちょっと簡単に言うと,1円硬貨,2円硬貨,3円硬貨…が無限枚あるときにピッタリ 円を払う方法の個数です.
解き方
それぞれの硬貨を何枚使うか?に着目します.明らかにN円硬貨より大きい硬貨を使うことはありません.なので,以降は1円硬貨,2円硬貨,3円硬貨,…,N円硬貨が無限枚あるとして考えます.
1円硬貨を何枚か使うとき,0円,1円,2円…が払えて,2円硬貨を使うとき,0円,2円,4円…が払えます.以降も同様に考えていくと,結局形式的冪級数 の 次までの係数を求めることができればよいことがわかります. 次以降の項を適当に切ってしまえば, 次の多項式の積になるのですが, 次の式が 個出てくるので,そのまま計算するのはしんどいです.
これは,等比数列の形になっているので, として変形できます.
これを計算するために,俗にexp-log典型と呼ばれるテクニックを使います.
exp-log典型
という性質を用います. であり,logの性質から
として求めることができます.
ここで, のマクローリン展開を考えると, となります.
さて, について のマクローリン展開したやつ を足し合わせていけばよいです.この式を計算する際, 次以降は切ってよいことから,いわゆる調和級数のやつで足し合わせる項の個数は になります.
さて, が求まれば,あとはexpを取ればよいです.これは, で求めることができます.
全体での計算量も となります.
提出↓
五角数定理を用いた解法
オイラーの五角数定理より,
が成り立ちます.右辺は の絶対値の小さい方から計算していくことで 次までを線形時間で求められます.あとは,この式のinv(逆数)を取ればよいです.これは, で行うことができます.
↓提出 judge.yosupo.jp
どちらも計算量は ですが,exp-logを用いた解法は 5998 ms かかっていたのに対し五角数定理を用いた解法は 649 ms と,かなり高速になりました.