結果

問題 No.658 テトラナッチ数列 Hard
ユーザー kurimupykurimupy
提出日時 2020-06-15 23:27:38
言語 C++14
(gcc 12.3.0 + boost 1.83.0)
結果
AC  
実行時間 623 ms / 2,000 ms
コード長 1,464 bytes
コンパイル時間 1,690 ms
コンパイル使用メモリ 173,824 KB
実行使用メモリ 4,380 KB
最終ジャッジ日時 2023-09-16 10:39:32
合計ジャッジ時間 5,221 ms
ジャッジサーバーID
(参考情報)
judge15 / judge11
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 1 ms
4,380 KB
testcase_01 AC 2 ms
4,380 KB
testcase_02 AC 2 ms
4,380 KB
testcase_03 AC 3 ms
4,376 KB
testcase_04 AC 221 ms
4,376 KB
testcase_05 AC 258 ms
4,376 KB
testcase_06 AC 324 ms
4,376 KB
testcase_07 AC 344 ms
4,380 KB
testcase_08 AC 414 ms
4,380 KB
testcase_09 AC 616 ms
4,380 KB
testcase_10 AC 623 ms
4,376 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

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

const long long mod = 17;
vector<vector<long long>> matprod(vector<vector<long long>> m1, vector<vector<long long>> m2, int n, int l, int m){
    vector<vector<long long>> y(n, vector<long long>(m));
    for (int i=0;i<n;i++){
        for (int j=0;j<m;j++){
            for (int k=0;k<l;k++){
                y[i][j] += m1[i][k] * m2[k][j] % mod;
                y[i][j] %= mod;
            }
        }
    }
    return y;
}
vector<vector<long long>> matpow(vector<vector<long long>> m1, int n, long long m){
    vector<vector<long long>> y(n, vector<long long>(n));
    vector<vector<long long>> bas = m1;
    for (int i=0;i<n;i++){
        y[i][i] = 1;
    }
    long long tmp = m;
    while (tmp != 0){
        if (tmp % 2 == 1){
            y = matprod(y, bas, n, n, n);
        }
        bas = matprod(bas, bas, n, n, n);
        tmp /= 2;
    }
    return y;
}
int main(void){
    // Your code here!
    int Q;
    cin >> Q;
    vector<long long> vec = {0, 0, 0, 1};
    vector<vector<long long>> mat = {
        {0, 1, 0, 0},
        {0, 0, 1, 0},
        {0, 0, 0, 1},
        {1, 1, 1, 1}
    };
    long long n;
    long long S;
    vector<vector<long long>> M;
    for (int _=0;_<Q;_++){
        cin >> n;
        M = matpow(mat, 4, n-1);
        S = 0;
        for (int i=0;i<4;i++){
            S += vec[i] * M[0][i] % mod;
            S %= mod;
        }
        cout << S << endl;
    }
    return 0;
}
0