結果
| 問題 |
No.1112 冥界の音楽
|
| コンテスト | |
| ユーザー |
Strorkis
|
| 提出日時 | 2020-07-11 13:41:44 |
| 言語 | Rust (1.83.0 + proconio) |
| 結果 |
AC
|
| 実行時間 | 26 ms / 2,000 ms |
| コード長 | 2,316 bytes |
| コンパイル時間 | 23,970 ms |
| コンパイル使用メモリ | 399,680 KB |
| 実行使用メモリ | 6,820 KB |
| 最終ジャッジ日時 | 2024-10-13 00:29:23 |
| 合計ジャッジ時間 | 15,026 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 34 |
ソースコード
use std::ops::{Mul, MulAssign};
#[derive(Clone)]
struct Matrix(Vec<Vec<usize>>);
impl Matrix {
const MOD: usize = 1_000_000_007;
fn pow(self, mut n: usize) -> Matrix {
let p = self.0.len();
let mut a = vec![vec![0; p]; p];
for i in 0..p {
a[i][i] = 1;
}
let mut res = Matrix(a);
let mut x = self.clone();
while n > 0 {
if n & 1 == 1 { res *= x.clone(); }
x *= x.clone();
n >>= 1;
}
res
}
}
impl Mul for Matrix {
type Output = Matrix;
fn mul(self, other: Matrix) -> Matrix {
let p = self.0.len();
let q = other.0[0].len();
let r = other.0.len();
let mut a = vec![vec![0; q]; p];
for i in 0..p {
for j in 0..q {
for k in 0..r {
a[i][j] += self.0[i][k] * other.0[k][j] % Matrix::MOD;
a[i][j] %= Matrix::MOD;
}
}
}
Matrix(a)
}
}
impl MulAssign for Matrix {
fn mul_assign(&mut self, rhs: Matrix) {
*self = (*self).clone() * rhs;
}
}
fn main() {
const MOD: usize = 1_000_000_007;
let (k, m, n): (usize, usize, usize) = {
let mut buf = String::new();
std::io::stdin().read_line(&mut buf).unwrap();
let mut iter = buf.split_whitespace();
(
iter.next().unwrap().parse().unwrap(),
iter.next().unwrap().parse().unwrap(),
iter.next().unwrap().parse().unwrap(),
)
};
let mut a = Matrix(vec![vec![0; k * k]; k * k]);
for _ in 0..m {
let (p, q, r): (usize, usize, usize) = {
let mut buf = String::new();
std::io::stdin().read_line(&mut buf).unwrap();
let mut iter = buf.split_whitespace();
(
iter.next().unwrap().parse::<usize>().unwrap() - 1,
iter.next().unwrap().parse::<usize>().unwrap() - 1,
iter.next().unwrap().parse::<usize>().unwrap() - 1,
)
};
a.0[p * k + q][q * k + r] = 1;
}
let res = a.pow(n - 2);
let mut ans = 0;
for i in 0..k {
for j in 0..k {
ans = (ans + res.0[i][j * k]) % MOD;
}
}
println!("{}", ans);
}
Strorkis