Untitled

 avatar
unknown
c_cpp
a year ago
1.6 kB
23
Indexable
#include <bits/stdc++.h>
using namespace std;
#define ll long long
int tt, tc;

const int mod = 1e9 + 7;
int add(int x, int y) { return (x + y) % mod; }
int sub(int x, int y) { return (x - y + mod) % mod; }
int mul(int x, int y) { return (x * 1LL * y) % mod; }
int modpow(int n, int k) {
    int res = 1;
    while (k) {
        if (k & 1) res = mul(res, n);
        n = mul(n, n);
        k >>= 1;
    }
    return res;
}
int divide(int a, int b) { return mul(a, modpow(b, mod - 2)); }

vector<vector<int>> mul(const vector<vector<int>>& a, const vector<vector<int>>& b) {
    int n = a.size(), m = b[0].size();
    vector<vector<int>> c(n, vector<int>(m));
    int r = a[0].size();
    assert(r == (int)b.size());

    for (int i = 0; i < n; i++)
        for (int j = 0; j < m; j++)
            for (int k = 0; k < r; k++)
                c[i][j] = add(c[i][j], mul(a[i][k], b[k][j]));

    return c;
}

void solve() {
    ll n;
    cin >> n;

    vector<vector<int>> mat(5, vector<int>(5));
    for (int i = 0; i < 4; i++)
        for (int k = 0; k < 4; k++) if (k != i) mat[i][k] = 1;
    mat[4][3] = mat[4][4] = 1;

    vector<vector<int>> a(5, vector<int>(5));
    for (int i = 0; i < 5; i++) a[i][i] = 1;

    vector<vector<int>> fin(5, vector<int>(1));
    fin[3][0] = 1;
    n += 1;
    while (n) {
        if (n & 1) a = mul(a, mat);
        mat = mul(mat, mat);
        n >>= 1;
    }
    a = mul(a, fin);
    cout << sub(a[4][0], 1) << "\n";   
}

int main() {
    ios::sync_with_stdio(0); cin.tie(0);
    tt = 1, tc = 1; // cin >> tt;
    while (tt--) solve(), tc++;
}
Editor is loading...
Leave a Comment