結果
問題 | No.1073 無限すごろく |
ユーザー |
![]() |
提出日時 | 2020-06-05 21:42:02 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 5 ms / 2,000 ms |
コード長 | 5,473 bytes |
コンパイル時間 | 4,764 ms |
コンパイル使用メモリ | 236,852 KB |
最終ジャッジ日時 | 2025-01-10 22:23:36 |
ジャッジサーバーID (参考情報) |
judge2 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 30 |
ソースコード
#pragma GCC optimize("Ofast")#include <bits/stdc++.h>#include <ext/pb_ds/assoc_container.hpp>#include <ext/pb_ds/tree_policy.hpp>using namespace std;using namespace __gnu_pbds;using ll = long long;using u64 = uint_fast64_t;using pii = pair<int, int>;using pll = pair<long long, long long>;#define rep(i, n) for(int i = 0; i < (n); ++i)#define all(x) (x).begin(),(x).end()constexpr char ln = '\n';constexpr long long MOD = 1000000007;//constexpr long long MOD = 998244353;template<class T1, class T2> inline bool chmax(T1 &a, T2 b) { if (a < b) { a = b; return true;} return false; }template<class T1, class T2> inline bool chmin(T1 &a, T2 b) { if (a > b) { a = b; return true;} return false; }inline int popcount(int x) {return __builtin_popcount(x);}inline int popcount(long long x) {return __builtin_popcountll(x);}void print() { cout << "\n"; }template<class T, class... Args>void print(const T &x, const Args &... args) {cout << x << " ";print(args...);}///////////////////////////////////////////////////////////////////////////////////////////////////////////////template <uint_fast64_t Modulus>struct ModInt {using u64 = uint_fast64_t;u64 a;constexpr ModInt(const long long x = 0) noexcept : a(x >= 0 ? x % Modulus : (Modulus - (-x) % Modulus) % Modulus) {}constexpr u64 &value() noexcept {return a;}constexpr const u64 &value() const noexcept {return a;}constexpr ModInt operator+(const ModInt rhs) const noexcept {return ModInt(*this) += rhs;}constexpr ModInt operator-(const ModInt rhs) const noexcept {return ModInt(*this) -= rhs;}constexpr ModInt operator*(const ModInt rhs) const noexcept {return ModInt(*this) *= rhs;}constexpr ModInt operator/(const ModInt rhs) const noexcept {return ModInt(*this) /= rhs;}constexpr ModInt operator^(const long long rhs) const noexcept {return ModInt(*this) ^= rhs;}constexpr bool operator==(const ModInt &rhs) const noexcept {return a == rhs.a;}constexpr bool operator!=(const ModInt &rhs) const noexcept {return a != rhs.a;}constexpr ModInt &operator+=(const ModInt rhs) noexcept {a += rhs.a;if (a >= Modulus) {a -= Modulus;}return *this;}constexpr ModInt &operator-=(const ModInt rhs) noexcept {if (a < rhs.a) {a += Modulus;}a -= rhs.a;return *this;}constexpr ModInt &operator*=(const ModInt rhs) noexcept {a = a * rhs.a % Modulus;return *this;}constexpr ModInt &operator/=(ModInt rhs) noexcept {u64 exp = Modulus - 2;while (exp) {if (exp&1) *this *= rhs;exp >>= 1;rhs *= rhs;}return *this;}constexpr ModInt &operator^=(long long exp) noexcept {ModInt rhs = a;a = 1;while (exp) {if (exp&1) *this *= rhs;exp >>= 1;rhs *= rhs;}return *this;}friend ostream &operator<<(ostream& os, const ModInt& rhs) noexcept {return os << rhs.a;}friend istream &operator>>(istream& is, ModInt& rhs) noexcept {long long a; is >> a; rhs = a; return is;}};using mint = ModInt<MOD>;template<typename T, int sz>struct Matrix {array<array<T, sz>, sz> A;int N;Matrix() : N(sz) {}Matrix(int N) : N(N) {}inline const array<T, sz> &operator[](int k) const {return A[k];}inline array<T, sz> &operator[](int k) {return A[k];}static Matrix I(int N) {Matrix<T, sz> mat(N);for(int i = 0; i < N; ++i) mat[i][i] = 1;return mat;}Matrix &operator+=(const Matrix &B) noexcept {for(int i = 0; i < N; ++i) {for(int j = 0; j < N; ++j) {(*this)[i][j] += B[i][j];}}return *this;}Matrix &operator-=(const Matrix &B) noexcept {for(int i = 0; i < N; ++i) {for(int j = 0; j < N; ++j) {(*this)[i][j] -= B[i][j];}}return *this;}Matrix &operator*=(const Matrix &B) noexcept {Matrix<T, sz> C(N);for(int i = 0; i < N; ++i) {for(int k = 0; k < N; ++k) {for(int j = 0; j < N; ++j) {C[i][j] += (*this)[i][k] * B[k][j];}}}for (int i = 0; i < N; ++i) {for (int j = 0; j < N; ++j) {swap(A[i][j],C.A[i][j]);}}return *this;}Matrix &operator^=(long long k) noexcept {Matrix<T, sz> B = Matrix<T, sz>::I(N);while(k) {if(k & 1) B *= *this;*this *= *this;k >>= 1;}for (int i = 0; i < N; ++i) {for (int j = 0; j < N; ++j) {swap(A[i][j],B.A[i][j]);}}return *this;}Matrix operator+(const Matrix &B) const noexcept {return (Matrix(*this) += B);}Matrix operator-(const Matrix &B) const noexcept {return (Matrix(*this) -= B);}Matrix operator*(const Matrix &B) const noexcept {return (Matrix(*this) *= B);}Matrix operator^(const long long k) const noexcept {return (Matrix(*this) ^= k);}};int main() {ios::sync_with_stdio(false); cin.tie(nullptr);ll N; cin >> N;Matrix<mint, 6> mat(6);mint b = mint(1)/6;rep(i,6) mat[0][i] = b;rep(i,5) mat[i+1][i] = 1;mat^= N;cout << mat[0][0] << ln;}