結果

問題 No.891 隣接3項間の漸化式
ユーザー shiro53
提出日時 2019-09-20 23:13:16
言語 C++14
(gcc 9.2.0)
結果
AC  
実行時間 4 ms
コード長 4,634 Byte
コンパイル時間 1,580 ms
使用メモリ 3,400 KB
最終ジャッジ日時 2020-01-28 02:49:59

テストケース

テストケース表示
入力 結果 実行時間
使用メモリ
0_sample01.txt AC 4 ms
3,296 KB
0_sample02.txt AC 0 ms
3,292 KB
0_sample03.txt AC 4 ms
3,288 KB
1_random_small01.txt AC 0 ms
3,364 KB
1_random_small02.txt AC 4 ms
3,396 KB
1_random_small03.txt AC 0 ms
3,316 KB
1_random_small04.txt AC 4 ms
3,332 KB
1_random_small05.txt AC 0 ms
3,336 KB
1_random_small06.txt AC 4 ms
3,376 KB
1_random_small07.txt AC 4 ms
3,368 KB
1_random_small08.txt AC 0 ms
3,400 KB
1_random_small09.txt AC 0 ms
3,392 KB
1_random_small10.txt AC 4 ms
3,340 KB
2_corner01.txt AC 4 ms
3,300 KB
2_corner02.txt AC 0 ms
3,372 KB
2_corner03.txt AC 4 ms
3,368 KB
2_corner04.txt AC 4 ms
3,332 KB
2_corner05.txt AC 0 ms
3,396 KB
2_corner06.txt AC 4 ms
3,336 KB
2_corner07.txt AC 0 ms
3,320 KB
2_corner08.txt AC 0 ms
3,376 KB
2_corner09.txt AC 4 ms
3,292 KB
2_corner10.txt AC 0 ms
3,348 KB
2_corner11.txt AC 4 ms
3,324 KB
2_corner12.txt AC 4 ms
3,392 KB
3_random01.txt AC 0 ms
3,400 KB
3_random02.txt AC 4 ms
3,396 KB
3_random03.txt AC 0 ms
3,400 KB
3_random04.txt AC 4 ms
3,284 KB
3_random05.txt AC 4 ms
3,372 KB
3_random06.txt AC 0 ms
3,288 KB
3_random07.txt AC 4 ms
3,292 KB
3_random08.txt AC 4 ms
3,336 KB
3_random09.txt AC 0 ms
3,288 KB
3_random10.txt AC 4 ms
3,268 KB
4_large01.txt AC 4 ms
3,332 KB
4_large02.txt AC 0 ms
3,268 KB
4_large03.txt AC 4 ms
3,388 KB
4_large04.txt AC 4 ms
3,316 KB
4_large05.txt AC 0 ms
3,320 KB
4_large06.txt AC 4 ms
3,336 KB
4_large07.txt AC 0 ms
3,300 KB
テストケース一括ダウンロード

ソースコード

diff #
#include <bits/stdc++.h>
using namespace std;
template <class T>
inline bool chmax(T &a, T b)
{
    if (a < b)
    {
        a = b;
        return 1;
    }
    return 0;
}
template <class T>
inline bool chmin(T &a, T b)
{
    if (a > b)
    {
        a = b;
        return 1;
    }
    return 0;
}
typedef long long int ll;

#define ALL(v) (v).begin(), (v).end()
#define RALL(v) (v).rbegin(), (v).rend()
#define endl "\n"
const double EPS = 1e-7;
const int INF = 1 << 30;
const ll LLINF = 1LL << 60;
const double PI = acos(-1);
const int MOD = 1000000007;
const int dx[4] = {1, 0, -1, 0};
const int dy[4] = {0, 1, 0, -1};

//-------------------------------------

template <class T>
struct Matrix
{
    vector<vector<T>> A;

    Matrix() {}

    Matrix(size_t n, size_t m) : A(n, vector<T>(m, 0)) {}

    Matrix(size_t n) : A(n, vector<T>(n, 0)){};

    size_t height() const
    {
        return (A.size());
    }

    size_t width() const
    {
        return (A[0].size());
    }

    inline const vector<T> &operator[](int k) const
    {
        return (A.at(k));
    }

    inline vector<T> &operator[](int k)
    {
        return (A.at(k));
    }

    static Matrix I(size_t n)
    {
        Matrix mat(n);
        for (int i = 0; i < n; i++)
            mat[i][i] = 1;
        return (mat);
    }

    Matrix &operator+=(const Matrix &B)
    {
        size_t n = height(), m = width();
        assert(n == B.height() && m == B.width());
        for (int i = 0; i < n; i++)
            for (int j = 0; j < m; j++)
                ((*this)[i][j] += B[i][j]) %= MOD;
        return (*this);
    }

    Matrix &operator-=(const Matrix &B)
    {
        size_t n = height(), m = width();
        assert(n == B.height() && m == B.width());
        for (int i = 0; i < n; i++)
            for (int j = 0; j < m; j++)
                ((*this)[i][j] += MOD - B[i][j]) %= MOD;
        return (*this);
    }

    Matrix &operator*=(const Matrix &B)
    {
        size_t n = height(), m = B.width(), p = width();
        assert(p == B.height());
        vector<vector<T>> C(n, vector<T>(m, 0));
        for (int i = 0; i < n; i++)
            for (int j = 0; j < m; j++)
                for (int k = 0; k < p; k++)
                    C[i][j] = (C[i][j] + (*this)[i][k] * B[k][j] % MOD) % MOD;
        A.swap(C);
        return (*this);
    }

    Matrix &operator^=(long long k)
    {
        Matrix B = Matrix::I(height());
        while (k > 0)
        {
            if (k & 1)
                B *= *this;
            *this *= *this;
            k >>= 1LL;
        }
        A.swap(B.A);
        return (*this);
    }

    Matrix operator+(const Matrix &B) const
    {
        return (Matrix(*this) += B);
    }

    Matrix operator-(const Matrix &B) const
    {
        return (Matrix(*this) -= B);
    }

    Matrix operator*(const Matrix &B) const
    {
        return (Matrix(*this) *= B);
    }

    Matrix operator^(const long long k) const
    {
        return (Matrix(*this) ^= k);
    }

    friend ostream &operator<<(ostream &os, Matrix &p)
    {
        size_t n = p.height(), m = p.width();
        for (int i = 0; i < n; i++)
        {
            os << "[";
            for (int j = 0; j < m; j++)
            {
                os << p[i][j] << (j + 1 == m ? "]\n" : ",");
            }
        }
        return (os);
    }

    T determinant()
    {
        Matrix B(*this);
        assert(width() == height());
        T ret = 1;
        for (int i = 0; i < width(); i++)
        {
            int idx = -1;
            for (int j = i; j < width(); j++)
            {
                if (B[j][i] != 0)
                    idx = j;
            }
            if (idx == -1)
                return (0);
            if (i != idx)
            {
                ret *= -1;
                swap(B[i], B[idx]);
            }
            ret *= B[i][i];
            T vv = B[i][i];
            for (int j = 0; j < width(); j++)
            {
                B[i][j] /= vv;
            }
            for (int j = i + 1; j < width(); j++)
            {
                T a = B[j][i];
                for (int k = 0; k < width(); k++)
                {
                    B[j][k] -= B[i][k] * a;
                }
            }
        }
        return (ret);
    }
};

int main()
{
    cin.tie(0);
    ios::sync_with_stdio(false);
    ll a, b, n;
    cin >> a >> b >> n;
    ll x0 = 0, x1 = 1;
    Matrix<ll> mat(2);
    vector<ll> tmp = {a, b};
    vector<ll> tmp2 = {1, 0};
    mat[0] = tmp;
    mat[1] = tmp2;
    mat ^= (n);
    ll ans = mat[1][0] * x1 % MOD + mat[1][1] * x0 % MOD;
    ans %= MOD;
    cout << ans << endl;
}
0