ラグランジュ補間について
なんとなくメモ。
ラグランジュ補間のアイデア
に関する N 次多項式 を, というヒントから表したいです。この時, とすれば, と表せることに注目します。
このように書くとハッピーなのは, とすると, を満たす について, が成り立つことです。このことから, が得られます。
実装
問題から がわかっています。多項式の係数 を求めるフェイズと実際に値を突っ込むフェイズに分けるとわかりやすい気がします。ちなみに yukicoder 42 を見なおしているときに書きたくなった記事なので yukicoder 42 っぽい感じで書いてます。
- 多項式の係数を求めるフェイズ
for (int i = 0; i < 6; i++) { // p を求める ll p = dp[6][q+i*500]; // q を求める ll q = 1; for (int j = 0; j < 6; j++) { if (i==j) continue; q *= i-j; } q = (q+MOD)%MOD; // c = p/q c[i] = p*mod_inverse(q, MOD); c[i] %= MOD; }
- 実際に値を突っ込むフェイズ
for (int i = 0; i < 6; i++) { // Q_i(m) の計算 ll tmp = 1; for (int j = 0; j < 6; j++) { if (i==j) continue; (tmp *= m-j) %= MOD; } // ret += c_i * Q_i(m) ret += c[i]*tmp % MOD; }