解説
DPn,i を、N=n,R=i のときの答えとします(M は与えられたものを使います)。
これは、以下のように計算できます。
- DP1: (1,0,…,0) です。
- DP2n,k: (i+j)modM=k∑DPn,iDPn,j です。DPn がわかっているとき、DP2n を O(M2) の時間計算量で計算できます。
- DPn+1,k: DPn,k+DPn,(k−1)modM です。DPn がわかっているとき、DPn+1 を O(M) の時間計算量で計算できます。
繰り返し二乗法と同じ要領で、O(M2logN) の時間計算量で DPN を計算できます。
なお、DP2n,k を高速な畳み込みを用いて計算することで O(MlogMlogN) の時間計算量で答えを求めることもできます。