結果
問題 | No.1704 Many Bus Stops (easy) |
ユーザー |
![]() |
提出日時 | 2021-10-08 23:11:07 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 154 ms / 2,000 ms |
コード長 | 7,160 bytes |
コンパイル時間 | 2,475 ms |
コンパイル使用メモリ | 203,056 KB |
最終ジャッジ日時 | 2025-01-24 23:17:59 |
ジャッジサーバーID (参考情報) |
judge2 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 1 |
other | AC * 41 |
ソースコード
#include <bits/stdc++.h>using namespace std;#define REP(i,n) for(ll i=0;i<(ll)n;i++)#define dump(x) cerr << "Line " << __LINE__ << ": " << #x << " = " << (x) << "\n";#define spa << " " <<#define fi first#define se second#define ALL(a) (a).begin(),(a).end()#define ALLR(a) (a).rbegin(),(a).rend()using ld = long double;using ll = long long;using ull = unsigned long long;using pii = pair<int, int>;using pll = pair<ll, ll>;using pdd = pair<ld, ld>;template<typename T> using V = vector<T>;template<typename T> using P = pair<T, T>;template<typename T> vector<T> make_vec(size_t n, T a) { return vector<T>(n, a); }template<typename... Ts> auto make_vec(size_t n, Ts... ts) { return vector<decltype(make_vec(ts...))>(n, make_vec(ts...)); }template<class S, class T> ostream& operator << (ostream& os, const pair<S, T> v){os << "(" << v.first << ", " << v.second << ")"; return os;}template<typename T> ostream& operator<<(ostream &os, const vector<T> &v) { for (auto &e : v) os << e << ' '; return os; }template<class T> ostream& operator<<(ostream& os, const vector<vector<T>> &v){ for(auto &e : v){os << e << "\n";} return os;}struct fast_ios { fast_ios(){ cin.tie(nullptr); ios::sync_with_stdio(false); cout << fixed << setprecision(20); }; } fast_ios_;template <class T> void UNIQUE(vector<T> &x) {sort(ALL(x));x.erase(unique(ALL(x)), x.end());}template<class T> bool chmax(T &a, const T &b) { if (a<b) { a=b; return 1; } return 0; }template<class T> bool chmin(T &a, const T &b) { if (a>b) { a=b; return 1; } return 0; }void fail() { cout << -1 << '\n'; exit(0); }inline int popcount(const int x) { return __builtin_popcount(x); }inline int popcount(const ll x) { return __builtin_popcountll(x); }template<typename T> void debug(vector<vector<T>>&v,ll h,ll w){for(ll i=0;i<h;i++){cerr<<v[i][0];for(ll j=1;j<w;j++)cerr spa v[i][j];cerr<<"\n";}};template<typename T> void debug(vector<T>&v,ll n){if(n!=0)cerr<<v[0];for(ll i=1;i<n;i++)cerr spa v[i];cerr<<"\n";};const ll INF = (1ll<<62);// const ld EPS = 1e-10;// const ld PI = acos(-1.0);const ll mod = (int)1e9 + 7;//const ll mod = 998244353;template< class T >struct Matrix {vector< vector< T > > A;Matrix() {}Matrix(int n, int m) : A(n, vector< T >(m, 0)) {}Matrix(int n) : A(n, vector< T >(n, 0)) {};int height() const {return (int)(A.size());}int width() const {return (int)(A[0].size());}inline const vector< T > &operator[](int k) const {return (A.at(k));}inline vector< T > &operator[](int k) {return (A.at(k));}static Matrix I(int 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) {int n = height(), m = B.width(), p = width();assert(p == B.height());vector< vector< T > > C(n, 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 ostream &operator<<(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);}};template <std::uint_fast64_t Modulus> class modint {// long long から modint を作るときは必ず正の数にしてからコンストラクタに入れること!// そうしないとバグりますusing u64 = std::uint_fast64_t;public:u64 a;constexpr modint(const u64 x = 0) noexcept : a(x % 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 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 % 2) {*this *= rhs;}rhs *= rhs;exp /= 2;}return *this;}};using mint = modint<mod>;void solve(){ll N;cin >> N;Matrix<mint> X(6, 6);Matrix<mint> y(6, 1);REP(i, 3){X[i][i] = mint(1)/3;}REP(i, 3){REP(j, 3){if(i != j){X[i][j+3] = mint(1)/3;}}}REP(i, 3){X[i+3][i] = 1;}// REP(i, 6){// REP(j, 6){// cout << X[i][j].value() << " ";// }// cout << endl;// }y[0][0] = mint(1)/3;y[3][0] = 1;auto z = (X^N) * y;cout << z[3][0].value() << endl;return;}int main(){ll t;cin >> t;while(t--) solve();return 0;}