結果
| 問題 | No.1595 The Final Digit | 
| コンテスト | |
| ユーザー |  | 
| 提出日時 | 2021-07-09 21:49:50 | 
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) | 
| 結果 | 
                                AC
                                 
                             | 
| 実行時間 | 2 ms / 2,000 ms | 
| コード長 | 4,850 bytes | 
| コンパイル時間 | 2,173 ms | 
| コンパイル使用メモリ | 201,640 KB | 
| 最終ジャッジ日時 | 2025-01-22 21:28:04 | 
| ジャッジサーバーID (参考情報) | judge4 / judge4 | 
(要ログイン)
| ファイルパターン | 結果 | 
|---|---|
| sample | AC * 3 | 
| other | AC * 17 | 
ソースコード
#include <bits/stdc++.h>
using ll = long long;
using std::cin;
using std::cout;
using std::endl;
std::mt19937 rnd(std::chrono::steady_clock::now().time_since_epoch().count());
template<class T> inline bool chmax(T& a, T b) { if (a < b) { a = b; return 1; } return 0; }
template<class T> inline bool chmin(T& a, T b) { if (a > b) { a = b; return 1; } return 0; }
const int inf = (int)1e9 + 7;
const long long INF = 1LL << 60;
template<int mod>
struct ModInt {
  int x;
  ModInt() : x(0) {}
  ModInt(int64_t y) : x(y >= 0 ? y % mod : (mod - (-y) % mod) % mod) {}
  ModInt &operator+=(const ModInt &p) {
    if((x += p.x) >= mod) x -= mod;
    return *this;
  }
  ModInt &operator-=(const ModInt &p) {
    if((x += mod - p.x) >= mod) x -= mod;
    return *this;
  }
  ModInt &operator*=(const ModInt &p) {
    x = (int) (1LL * x * p.x % mod);
    return *this;
  }
  ModInt &operator/=(const ModInt &p) {
    *this *= p.inverse();
    return *this;
  }
  ModInt operator-() const { return ModInt(-x); }
  ModInt operator+(const ModInt &p) const { return ModInt(*this) += p; }
  ModInt operator-(const ModInt &p) const { return ModInt(*this) -= p; }
  ModInt operator*(const ModInt &p) const { return ModInt(*this) *= p; }
  ModInt operator/(const ModInt &p) const { return ModInt(*this) /= p; }
  bool operator==(const ModInt &p) const { return x == p.x; }
  bool operator!=(const ModInt &p) const { return x != p.x; }
  ModInt inverse() const {
    int a = x, b = mod, u = 1, v = 0, t;
    while(b > 0) {
      t = a / b;
      std::swap(a -= t * b, b);
      std::swap(u -= t * v, v);
    }
    return ModInt(u);
  }
  ModInt pow(int64_t n) const {
    ModInt ret(1), mul(x);
    while(n > 0) {
      if(n & 1) ret *= mul;
      mul *= mul;
      n >>= 1;
    }
    return ret;
  }
  friend std::ostream &operator<<(std::ostream &os, const ModInt &p) {
    return os << p.x;
  }
  friend std::istream &operator>>(std::istream &is, ModInt &a) {
    int64_t t;
    is >> t;
    a = ModInt< mod >(t);
    return (is);
  }
  static int get_mod() { return mod; }
};
constexpr int mod = 10;
using mint = ModInt<mod>;
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^=(long long k) {
    Matrix B = Matrix::I(height());
    while(k > 0) {
      if(k & 1) B *= *this;
      *this *= *this;
      k >>= 1LL;
    }
    A.swap(B.A);
    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);
  }
  Matrix operator^(const long long k) const {
    return (Matrix(*this) ^= k);
  }
  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);
  }
};
void solve()
{
  int p, q, r; cin >> p >> q >> r;
  p %= 10, q %= 10, r %= 10;
  ll K; cin >> K;
  Matrix<mint> mat(3, 3);
  mat[1][0] = mat[2][1] =1;
  mat[0][0] = mat[0][1] = mat[0][2] = 1;
  mat ^= (K - 3);
  mint res = mat[0][0] * r + mat[0][1] * q + mat[0][2] * p;
  cout << res << "\n";
}
int main()
{
  std::cin.tie(nullptr);
  std::ios::sync_with_stdio(false);
  int kkt = 1; 
  // cin >> kkt;
  while(kkt--)
    solve();
  return 0;
}
            
            
            
        