結果

問題 No.1105 Many Triplets
コンテスト
ユーザー akkey
提出日時 2026-08-02 16:04:19
言語 Rust
(1.94.0 + proconio + num + itertools)
コンパイル:
/usr/bin/rustc_custom
実行:
./target/release/main
結果
AC  
実行時間 0 ms / 2,000 ms
+ 813µs
コード長 1,046 bytes
記録
記録タグの例:
初AC ショートコード 純ショートコード 純主流ショートコード 最速実行時間
コンパイル時間 805 ms
コンパイル使用メモリ 191,836 KB
実行使用メモリ 5,888 KB
最終ジャッジ日時 2026-08-02 16:04:27
合計ジャッジ時間 2,791 ms
ジャッジサーバーID
(参考情報)
judge2_1 / judge3_0
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 3
other AC * 25
権限があれば一括ダウンロードができます

ソースコード

diff #
raw source code

#![allow(clippy::needless_range_loop)]
use proconio::{fastout, input, marker::Usize1};
use std::array;
const M: usize = 10usize.pow(9) + 7;
const SIZE: usize = 3;

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

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

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

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