結果
| 問題 | No.665 Bernoulli Bernoulli | 
| コンテスト | |
| ユーザー |  xuzijian629 | 
| 提出日時 | 2018-09-11 01:29:05 | 
| 言語 | C++11(廃止可能性あり) (gcc 13.3.0) | 
| 結果 | 
                                AC
                                 
                             | 
| 実行時間 | 336 ms / 2,000 ms | 
| コード長 | 1,885 bytes | 
| コンパイル時間 | 738 ms | 
| コンパイル使用メモリ | 100,892 KB | 
| 実行使用メモリ | 6,784 KB | 
| 最終ジャッジ日時 | 2024-06-11 16:01:53 | 
| 合計ジャッジ時間 | 7,423 ms | 
| ジャッジサーバーID (参考情報) | judge5 / judge2 | 
(要ログイン)
| ファイルパターン | 結果 | 
|---|---|
| sample | AC * 4 | 
| other | AC * 15 | 
ソースコード
#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>
#include <stack>
#include <queue>
#include <set>
#include <map>
#include <unordered_map>
#include <chrono>
#include <random>
#include <functional>
#include <utility>
#include <cassert>
#pragma GCC optimize("O3")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
#pragma comment(linker, "STACK:36777216")
using namespace std;
using i64 = int64_t;
constexpr i64 MOD = 1e9 + 7;
mt19937 rnd(chrono::steady_clock::now().time_since_epoch().count());
using vi = vector<i64>;
using vvi = vector<vi>;
using vvvi = vector<vvi>;
using ii = pair<i64, i64>;
i64 fact[202020];
i64 factinv[202020];
i64 Ber[10001];
i64 modpow(i64 a, i64 n) {
    if (n == 0) return 1;
    if (n % 2 == 0) {
        i64 t = modpow(a, n / 2);
        return t * t % MOD;
    }
    return a * modpow(a, n - 1) % MOD;
}
i64 comb(int n, int r);
void make() {
    fact[0] = 1;
    for (int i = 1; i < 202020; i++) {
        fact[i] = fact[i - 1] * i % MOD;
    }
    for (int i = 0; i < 202020; i++) {
        factinv[i] = modpow(fact[i], MOD - 2);
        assert(fact[i] * factinv[i] % MOD == 1);
    }
    
    Ber[0] = 1;
    for (int i = 1; i < 10001; i++) {
        i64 tmp = 0;
        for (int j = 0; j < i; j++) {
            tmp += comb(i + 1, j) * Ber[j];
            tmp %= MOD;
        }
        Ber[i] = -1 * modpow(i + 1, MOD - 2) * tmp % MOD;
    }
}
i64 comb(int n, int r) {
    if (n < 0 || r < 0 || r > n) return 0;
    return fact[n] * factinv[r] % MOD * factinv[n - r] % MOD;
}
int main() {
    make();
    i64 ans = 0;
    i64 n, k;
    cin >> n >> k;
    for (int j = 0; j <= k; j++) {
        ans += comb(k + 1, j) * Ber[j] % MOD * modpow((n + 1) % MOD, k + 1 - j) % MOD;
        ans %= MOD;
    }
    ans *= modpow(k + 1, MOD - 2);
    ans %= MOD;
    cout << (ans + MOD) % MOD << endl;
}
            
            
            
        