形式的冪級数を用いた解法について書きます.もっと高速な解法もあるようですが,わかんないです. 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 と,かなり高速になりました.