結果
| 問題 |
No.665 Bernoulli Bernoulli
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2021-08-03 13:54:06 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 6 ms / 2,000 ms |
| コード長 | 1,543 bytes |
| コンパイル時間 | 1,907 ms |
| コンパイル使用メモリ | 197,652 KB |
| 最終ジャッジ日時 | 2025-01-23 13:56:16 |
|
ジャッジサーバーID (参考情報) |
judge3 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 4 |
| other | AC * 15 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
int lagrange_interpolating_polynomial(vector<int64_t> xs, vector<int64_t> ys, int64_t x, int MOD) {
auto mod = [&](auto n) { return (n % MOD + MOD) % MOD; };
transform(begin(xs), end(xs), begin(xs), mod);
transform(begin(ys), end(ys), begin(ys), mod);
x = mod(x);
int n = size(xs);
vector<int64_t> inv(n + 1, 1), L(n + 1, 1), R(n + 1, 1);
for (int i = 1; i <= n; ++i) {
if (i > 1) inv[i] = MOD - inv[MOD % i] * (MOD / i) % MOD;
L[i] = L[i - 1] * ((x + MOD - xs[i - 1]) % MOD) % MOD * inv[i] % MOD;
R[i] = R[i - 1] * ((x + MOD - xs[n - i]) % MOD) % MOD * inv[i] % MOD;
}
int ans = 0;
for (int i = 0; i < n; ++i) {
auto P = ((n - i - 1) & 1 ? MOD - 1 : 1) * (L[i] * R[n - i - 1] % MOD) % MOD;
ans = (ans + ys[i] * P % MOD) % MOD;
}
return ans;
}
int64_t mod_pow(int64_t x, int64_t n, int MOD) {
int64_t res = 1;
while (n > 0) {
if (n & 1) (res *= x) %= MOD;
(x *= x) %= MOD;
n >>= 1;
}
return res;
}
int faulhaber_formula(int64_t n, int k, int MOD) {
vector<int64_t> xs(k + 2), ys(k + 2);
for (int i = 0; i < k + 2; ++i) {
xs[i] = (i + 1) % MOD;
ys[i] = mod_pow(i + 1, k, MOD);
if (i) (ys[i] += ys[i - 1]) %= MOD;
}
return lagrange_interpolating_polynomial(xs, ys, n, MOD);
}
int main() {
long n, k;
cin >> n >> k;
const int MOD = 1'000'000'007;
cout << faulhaber_formula(n, k, MOD) << endl;
return 0;
}