結果

問題 No.978 Fibonacci Convolution Easy
ユーザー hrbt__hrbt__
提出日時 2020-03-09 19:11:09
言語 C++14
(gcc 12.3.0 + boost 1.83.0)
結果
AC  
実行時間 144 ms / 2,000 ms
コード長 2,508 bytes
コンパイル時間 1,763 ms
コンパイル使用メモリ 168,796 KB
実行使用メモリ 34,432 KB
最終ジャッジ日時 2024-11-08 19:15:29
合計ジャッジ時間 3,532 ms
ジャッジサーバーID
(参考情報)
judge2 / judge4
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 4 ms
5,248 KB
testcase_01 AC 57 ms
15,324 KB
testcase_02 AC 30 ms
9,472 KB
testcase_03 AC 137 ms
33,152 KB
testcase_04 AC 37 ms
10,928 KB
testcase_05 AC 9 ms
5,248 KB
testcase_06 AC 52 ms
13,816 KB
testcase_07 AC 92 ms
22,768 KB
testcase_08 AC 64 ms
16,628 KB
testcase_09 AC 105 ms
25,472 KB
testcase_10 AC 142 ms
34,432 KB
testcase_11 AC 43 ms
12,160 KB
testcase_12 AC 9 ms
5,248 KB
testcase_13 AC 52 ms
13,524 KB
testcase_14 AC 16 ms
6,272 KB
testcase_15 AC 56 ms
15,104 KB
testcase_16 AC 142 ms
34,416 KB
testcase_17 AC 144 ms
34,432 KB
testcase_18 AC 2 ms
5,248 KB
testcase_19 AC 2 ms
5,248 KB
testcase_20 AC 2 ms
5,248 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

#include <bits/stdc++.h>
using namespace std;

struct ModInt {
    using M = ModInt;

    static vector<M> fact, finv;
    static long long MOD;
    long long v;

    // normalize: [-MOD, MOD**2] -> [0, MOD)
    ModInt(const long long _v = 0) : v((_v < 0) ? _v % MOD + MOD : _v % MOD) {}

    M operator+(const M& x) const { return M(v + x.v); }
    M operator-(const M& x) const { return M(v - x.v); }
    M operator*(const M& x) const { return M(v * x.v); }
    M operator/(const M& x) const { return M(v * x.inv().v); }
    M& operator+=(const M& x) { return *this = *this + x; }
    M& operator-=(const M& x) { return *this = *this - x; }
    M& operator*=(const M& x) { return *this = *this * x; }
    M& operator/=(const M& x) { return *this = *this / x; }
    bool operator==(const M& x) const { return v == x.v; }
    bool operator!=(const M& x) const { return v != x.v; }
    friend istream& operator>>(istream& input, M& x) {
        return input >> x.v, x = M(x), input;
    }
    friend ostream& operator<<(ostream& output, const M& x) {
        return output << x.v;
    }
    inline M pow(long long n) const {
        M x(v), res(1);
        while (n) {
            if (n & 1) res *= x;
            x *= x;
            n >>= 1;
        }
        return res;
    }
    inline M inv() const { return this->pow(MOD - 2); }
    static void build(int n) {
        fact.assign(n + 1, 1);
        for (int i = 1; i < n + 1; i++) fact[i] = fact[i - 1] * M(i);
        finv.assign(n + 1, fact[n].inv());
        for (int i = n; i > 0; i--) finv[i - 1] = finv[i] * M(i);
    }
    static M comb(int n, int k) {
        if (n < k || k < 0) return M(0);
        return fact[n] * finv[n - k] * finv[k];
    }
    static M extgcd(int a, int b, int& x, int& y) {
        M d(a);
        if (b) {
            d = extgcd(b, a % b, y, x);
            y -= (a / b) * x;
        } else {
            x = 1;
            y = 0;
        }
        return d;
    }
};
vector<ModInt> ModInt::fact = vector<ModInt>();
vector<ModInt> ModInt::finv = vector<ModInt>();
long long ModInt::MOD = 1e9 + 7;

int main() {
    int n;
    ModInt p;
    cin >> n >> p;
    vector<ModInt> a(n, 0);
    a[1] = 1;
    for (int i = 2; i < n; i++) {
        a[i] = p * a[i - 1] + a[i - 2];
    }
    vector<ModInt> cumsum(n + 1, 0);
    for (int i = 0; i < n; i++) {
        cumsum[i + 1] = cumsum[i] + a[i];
    }
    ModInt ans = 0;
    for (int i = 0; i < n; i++) {
        ans += a[i] * cumsum[i + 1];
    }
    cout << ans << endl;
}
0