結果

問題 No.658 テトラナッチ数列 Hard
コンテスト
ユーザー akkey
提出日時 2026-08-02 15:57:32
言語 Rust
(1.94.0 + proconio + num + itertools)
コンパイル:
/usr/bin/rustc_custom
実行:
./target/release/main
結果
AC  
実行時間 9 ms / 2,000 ms
+ 348µs
コード長 981 bytes
記録
記録タグの例:
初AC ショートコード 純ショートコード 純主流ショートコード 最速実行時間
コンパイル時間 6,654 ms
コンパイル使用メモリ 192,372 KB
実行使用メモリ 5,888 KB
最終ジャッジ日時 2026-08-02 15:57:47
合計ジャッジ時間 8,316 ms
ジャッジサーバーID
(参考情報)
judge3_0 / judge2_0
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 3
other AC * 8
権限があれば一括ダウンロードができます

ソースコード

diff #
raw source code

#![allow(clippy::needless_range_loop)]
use proconio::{fastout, input, marker::Usize1};
use std::array;
const M: usize = 17;

#[fastout]
fn main() {
    input! {
        n: [Usize1]
    }
    let mat = [[0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1], [1, 1, 1, 1]];
    let mut doubling = vec![mat; 64];
    for i in 1..64 {
        doubling[i] = mat_mul(&doubling[i - 1], &doubling[i - 1]);
    }
    for ni in n {
        let mut vec = [0, 0, 0, 1];
        for i in 0..64 - ni.leading_zeros() as usize {
            if ni >> i & 1 == 1 {
                vec = mat_vec_mul(&doubling[i], &vec);
            }
        }

        println!("{}", vec[0]);
    }
}

fn mat_mul(l: &[[usize; 4]; 4], r: &[[usize; 4]; 4]) -> [[usize; 4]; 4] {
    array::from_fn(|i| array::from_fn(|j| (0..4).map(|k| l[i][k] * r[k][j] % M).sum::<usize>() % M))
}

fn mat_vec_mul(m: &[[usize; 4]; 4], x: &[usize; 4]) -> [usize; 4] {
    array::from_fn(|i| (0..4).map(|j| m[i][j] * x[j] % M).sum::<usize>() % M)
}
0