結果

問題 No.891 隣接3項間の漸化式
ユーザー potoooooooopotoooooooo
提出日時 2019-09-20 22:14:00
言語 C++14
(gcc 12.3.0 + boost 1.83.0)
結果
AC  
実行時間 3 ms / 2,000 ms
コード長 7,462 bytes
コンパイル時間 2,081 ms
コンパイル使用メモリ 179,816 KB
実行使用メモリ 5,376 KB
最終ジャッジ日時 2024-09-14 17:58:48
合計ジャッジ時間 3,197 ms
ジャッジサーバーID
(参考情報)
judge3 / judge1
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 2 ms
5,248 KB
testcase_01 AC 2 ms
5,376 KB
testcase_02 AC 2 ms
5,376 KB
testcase_03 AC 2 ms
5,376 KB
testcase_04 AC 2 ms
5,376 KB
testcase_05 AC 2 ms
5,376 KB
testcase_06 AC 2 ms
5,376 KB
testcase_07 AC 2 ms
5,376 KB
testcase_08 AC 2 ms
5,376 KB
testcase_09 AC 2 ms
5,376 KB
testcase_10 AC 2 ms
5,376 KB
testcase_11 AC 2 ms
5,376 KB
testcase_12 AC 2 ms
5,376 KB
testcase_13 AC 2 ms
5,376 KB
testcase_14 AC 2 ms
5,376 KB
testcase_15 AC 2 ms
5,376 KB
testcase_16 AC 2 ms
5,376 KB
testcase_17 AC 2 ms
5,376 KB
testcase_18 AC 2 ms
5,376 KB
testcase_19 AC 2 ms
5,376 KB
testcase_20 AC 3 ms
5,376 KB
testcase_21 AC 2 ms
5,376 KB
testcase_22 AC 2 ms
5,376 KB
testcase_23 AC 2 ms
5,376 KB
testcase_24 AC 2 ms
5,376 KB
testcase_25 AC 2 ms
5,376 KB
testcase_26 AC 2 ms
5,376 KB
testcase_27 AC 2 ms
5,376 KB
testcase_28 AC 2 ms
5,376 KB
testcase_29 AC 2 ms
5,376 KB
testcase_30 AC 2 ms
5,376 KB
testcase_31 AC 2 ms
5,376 KB
testcase_32 AC 2 ms
5,376 KB
testcase_33 AC 2 ms
5,376 KB
testcase_34 AC 2 ms
5,376 KB
testcase_35 AC 2 ms
5,376 KB
testcase_36 AC 2 ms
5,376 KB
testcase_37 AC 2 ms
5,376 KB
testcase_38 AC 2 ms
5,376 KB
testcase_39 AC 2 ms
5,376 KB
testcase_40 AC 2 ms
5,376 KB
testcase_41 AC 2 ms
5,376 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

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

template<class Numeric> class Matrix {
    protected:
        vector< vector<Numeric> > _mat;
        int _col, _row;
        const bool usingModulo = true;
        const Numeric modulo = 1000000007; // using modulo
        void resize(int col, int row) {
            _col = col; _row = row;
            _mat.assign(col, vector<Numeric>(row, 0));
        }
    public:
        Matrix(int col, int row) : _col(col), _row(row) {
            _mat.assign(col, vector<Numeric>(row, 0));
        }
        Matrix(int col, int row, int num) : _col(col), _row(row) {
            _mat.assign(col, vector<Numeric>(row, num));
        }
        int col() const { return _col; }
        int row() const { return _row; }
        vector<vector<Numeric>> mat() const {return _mat; }
        vector<Numeric> &operator[](int i) { return _mat[i]; }
        Numeric &operator() (int i, int j) { return _mat[i][j]; }
        Matrix<Numeric> &operator=(Matrix<Numeric> x) {
            this->_mat = x.mat();
            return *this;
        }
        Matrix<Numeric> operator+(Matrix<Numeric> &x) {
            if (this->col() != x.col() || this->row() != x.row()) {
                cout << "matrices are different sizes .. ";
                this->size(false); cout << "+"; x.size(true);
                exit(0);
            }
            Matrix<Numeric> ret(this->col(), this->row());
            for (int i = 0; i < this->col(); ++i) {
                for (int j = 0; j < this->row(); ++j) {
                    ret[i][j] = _mat[i][j] + x[i][j];
                    if (usingModulo) ret[i][j] %= modulo;
                }
            }
            return ret;
        }
        Matrix<Numeric> &operator+=(Matrix<Numeric> &x) {
            if (this->col() != x.col() || this->row() != x.row()) {
                cout << "matrices are different sizes .. ";
                this->size(false); cout << "+"; x.size(true);
                exit(0);
            }
            for (int i = 0; i < this->col(); ++i) {
                for (int j = 0; j < this->row(); ++j) {
                    _mat[i][j] += x[i][j];
                    if (usingModulo) _mat[i][j] %= modulo;
                }
            }
            return *this;
        }
        Matrix<Numeric> operator-(Matrix<Numeric> &x) {
            if (this->col() != x.col() || this->row() != x.row()) {
                cout << "matrices are different sizes .. ";
                this->size(false); cout << "-"; x.size(true);
                exit(0);
            }
            Matrix<Numeric> ret(this->col(), this->row());
            for (int i = 0; i < this->col(); ++i) {
                for (int j = 0; j < this->row(); ++j) {
                    ret[i][j] = _mat[i][j] - x[i][j];
                    if (usingModulo) ret[i][j] %= modulo;
                }
            }
            return ret;
        }
        Matrix<Numeric> &operator-=(Matrix<Numeric> &x) {
            if (this->col() != x.col() || this->row() != x.row()) {
                cout << "matrices are different sizes .. ";
                this->size(false); cout << "-"; x.size(true);
                exit(0);
            }
            for (int i = 0; i < this->col(); ++i) {
                for (int j = 0; j < this->row(); ++j) {
                    _mat[i][j] -= x[i][j];
                    if (usingModulo) _mat[i][j] %= modulo;
                }
            }
            return *this;
        }
        Matrix<Numeric> operator*(Matrix<Numeric> &x) {
            if (this->row() != x.col()) {
                cout << "cannot multiply matrices .. ";
                this->size(false); cout << "*"; x.size(true);
                exit(0);
            }
            Matrix<Numeric> ret(this->col(), x.row());
            for (int i = 0; i < this->col(); ++i) {
                for (int j = 0; j < x.row(); ++j) {
                    for (int k = 0; k < this->row(); ++k) {
                        ret[i][j] += _mat[i][k] * x[k][j];
                        if (usingModulo) ret[i][j] %= modulo;
                    }
                }
            }
            return ret;
        }
        Matrix<Numeric> &operator*(Numeric k) {
            Matrix<Numeric> ret(this->col(), this->row());
            for (int i = 0; i < this->col(); ++i) {
                for (int j = 0; j < this->row(); ++j) {
                    ret(i, j) = _mat[i][j] * k;
                    if (usingModulo) ret(i, j) %= modulo;
                }
            }
            return ret;
        }
        Matrix<Numeric> &operator*=(Matrix<Numeric> &x) {
            if (this->row() != x.col()) {
                cout << "cannot multiply matrices .. ";
                this->size(false); cout << "*"; x.size(true);
                exit(0);
            }
            Matrix<Numeric> ret(this->col(), x.row());
            for (int i = 0; i < this->col(); ++i) {
                for (int j = 0; j < x.row(); ++j) {
                    for (int k = 0; k < this->row(); ++k) {
                        ret[i][j] += _mat[i][k] * x[k][j];
                        if (usingModulo) ret[i][j] %= modulo;
                    }
                }
            }
            this->resize(this->col(), x.row());
            for (int i = 0; i < this->col(); ++i) {
                for (int j = 0; j < x.row(); ++j) {
                    _mat[i][j] = ret[i][j];
                }
            }
            return *this;
        }
        Matrix<Numeric> &operator*=(Numeric k) {
            Matrix<Numeric> ret(this->col(), this->row());
            for (int i = 0; i < this->col(); ++i) {
                for (int j = 0; j < this->row(); ++j) {
                    _mat[i][j] *= k;
                    if (usingModulo) _mat %= modulo;
                }
            }
            return *this;
        }
        Numeric sum() {
            Numeric ret = 0;
            for (int i = 0; i < this->col(); ++i) {
                for (int j = 0; j < this->row(); ++j) {
                    ret += _mat[i][j];
                    if (usingModulo) ret %= modulo;
                }
            }
            return ret;
        }
        void print() {
            cout << "-- print "; this->size(false); cout << " --" << endl;
            for (int i = 0; i < _col; ++i) {
                for (int j = 0; j < _row; ++j) {
                    if (j != 0) cout << "\t";
                    cout << _mat[i][j];
                }
                cout << endl;
            }
            cout << "------------------" << endl;
        }
        void print(string str) {
            cout << "-- print \"" << str << "\" "; this->size(false); cout << " --" << endl;
            for (int i = 0; i < _col; ++i) {
                for (int j = 0; j < _row; ++j) {
                    if (j != 0) cout << "\t";
                    cout << _mat[i][j];
                }
                cout << endl;
            }
            cout << "------------------" << endl;
        }
        void size (bool endline = true) const {
            cout << "(" << this->col() << ", " << this->row() << ")";
            if (endline) cout << endl;
        }
};

int main() {
    long long a, b, n; cin >> a >> b >> n;
    Matrix<long long> ans(2, 1), x(2, 2);
    ans[0][0] = 1; ans[1][0] = 0;
    x[0][0] = a; x[0][1] = b;
    x[1][0] = 1; x[1][1] = 0;
    while (n) {
        if (n & 1) ans = x * ans;
        x *= x;
        n /= 2;
    }
    cout << ans[1][0] << endl;
    return 0;
}
0