結果
問題 | No.1340 おーじ君をさがせ |
ユーザー |
![]() |
提出日時 | 2021-01-16 17:50:49 |
言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 313 ms / 2,000 ms |
コード長 | 4,438 bytes |
コンパイル時間 | 1,783 ms |
コンパイル使用メモリ | 173,864 KB |
実行使用メモリ | 5,248 KB |
最終ジャッジ日時 | 2024-11-27 23:34:03 |
合計ジャッジ時間 | 7,380 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 59 |
ソースコード
/*** @FileName a.cpp* @Author kanpurin* @Created 2021.01.16 17:50:34**/#include "bits/stdc++.h"using namespace std;typedef long long ll;template< class T >struct Matrix {std::vector< std::vector< T > > A;Matrix() {}Matrix(size_t n, size_t m) : A(n, std::vector< T >(m, 0)) {}Matrix(size_t n) : A(n, std::vector< T >(n, 0)) {};size_t height() const {return (A.size());}size_t width() const {return (A[0].size());}inline const std::vector< T > &operator[](int k) const {return (A.at(k));}inline std::vector< T > &operator[](int k) {return (A.at(k));}static Matrix I(size_t n) {Matrix mat(n);for (int i = 0; i < n; i++) mat[i][i] = 1;return (mat);}Matrix &operator+=(const Matrix &B) {size_t n = height(), m = width();assert(n == B.height() && m == B.width());for (int i = 0; i < n; i++)for (int j = 0; j < m; j++)(*this)[i][j] += B[i][j];return (*this);}Matrix &operator-=(const Matrix &B) {size_t n = height(), m = width();assert(n == B.height() && m == B.width());for (int i = 0; i < n; i++)for (int j = 0; j < m; j++)(*this)[i][j] -= B[i][j];return (*this);}Matrix &operator*=(const Matrix &B) {size_t n = height(), m = B.width(), p = width();assert(p == B.height());std::vector< std::vector< T > > C(n, std::vector< T >(m, 0));for (int i = 0; i < n; i++)for (int j = 0; j < m; j++)for (int k = 0; k < p; k++)C[i][j] = (C[i][j] + (*this)[i][k] * B[k][j]);A.swap(C);return (*this);}Matrix operator+(const Matrix &B) const {return (Matrix(*this) += B);}Matrix operator-(const Matrix &B) const {return (Matrix(*this) -= B);}Matrix operator*(const Matrix &B) const {return (Matrix(*this) *= B);}bool operator==(const Matrix &B) const {assert(this->A.size() == B.A.size() && this->A[0].size() == B.A[0].size());int n = this->A.size();int m = this->A[0].size();for (int i = 0; i < n; i++)for (int j = 0; j < m; j++)if (this->A[i][j] != B.A[i][j]) return false;return true;}bool operator!=(const Matrix &B) const {return !(*this == B);}friend std::ostream &operator<<(std::ostream &os, Matrix &p) {size_t n = p.height(), m = p.width();for (int i = 0; i < n; i++) {os << "[";for (int j = 0; j < m; j++) {os << p[i][j] << (j + 1 == m ? "]\n" : ",");}}return (os);}T determinant() {Matrix B(*this);assert(width() == height());T ret = 1;for (int i = 0; i < width(); i++) {int idx = -1;for (int j = i; j < width(); j++) {if (B[j][i] != 0) idx = j;}if (idx == -1) return (0);if (i != idx) {ret *= -1;swap(B[i], B[idx]);}ret *= B[i][i];T vv = B[i][i];for (int j = 0; j < width(); j++) {B[i][j] /= vv;}for (int j = i + 1; j < width(); j++) {T a = B[j][i];for (int k = 0; k < width(); k++) {B[j][k] -= B[i][k] * a;}}}return (ret);}Matrix pow(ll k) const {auto res = I(A.size());auto M = *this;while (k > 0) {if (k & 1) {res *= M;}M *= M;k >>= 1;}return res;}};struct A {int x;A(int x):x(x){}A operator*(const A &b) const {return A(this->x*b.x);}A operator+(const A &b) const {return A(min(1,this->x+b.x));}};int main() {ll n,m,t;cin >> n >> m >> t;Matrix<A> mat(n);for (int i = 0; i < m; i++) {int a,b;cin >> a >> b;mat[a][b] = 1;}int ans = 0;mat = mat.pow(t);for (int i = 0; i < n; i++) {ans += mat[0][i].x;}cout << ans << endl;return 0;}