結果
問題 | No.1704 Many Bus Stops (easy) |
ユーザー |
![]() |
提出日時 | 2021-10-08 22:38:17 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 49 ms / 2,000 ms |
コード長 | 11,633 bytes |
コンパイル時間 | 7,178 ms |
コンパイル使用メモリ | 276,572 KB |
最終ジャッジ日時 | 2025-01-24 22:53:19 |
ジャッジサーバーID (参考情報) |
judge2 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 1 |
other | AC * 41 |
ソースコード
#define MOD_TYPE 1#pragma region Macros#include <bits/stdc++.h>using namespace std;#include <atcoder/all>using namespace atcoder;#if 0#include <boost/multiprecision/cpp_dec_float.hpp>#include <boost/multiprecision/cpp_int.hpp>using Int = boost::multiprecision::cpp_int;using lld = boost::multiprecision::cpp_dec_float_100;#endif#if 1#pragma GCC target("avx2")#pragma GCC optimize("O3")#pragma GCC optimize("unroll-loops")#endifusing ll = long long int;using ld = long double;using pii = pair<int, int>;using pll = pair<ll, ll>;using pld = pair<ld, ld>;template <typename Q_type>using smaller_queue = priority_queue<Q_type, vector<Q_type>, greater<Q_type>>;#if MOD_TYPE == 1constexpr ll MOD = ll(1e9 + 7);#else#if MOD_TYPE == 2constexpr ll MOD = 998244353;#elseconstexpr ll MOD = 1000003;#endif#endifusing mint = static_modint<MOD>;constexpr int INF = (int)1e9 + 10;constexpr ll LINF = (ll)4e18;constexpr double PI = acos(-1.0);constexpr double EPS = 1e-11;constexpr int Dx[] = {0, 0, -1, 1, -1, 1, -1, 1, 0};constexpr int Dy[] = {1, -1, 0, 0, -1, -1, 1, 1, 0};#define REP(i, m, n) for (ll i = m; i < (ll)(n); ++i)#define rep(i, n) REP(i, 0, n)#define REPI(i, m, n) for (int i = m; i < (int)(n); ++i)#define repi(i, n) REPI(i, 0, n)#define MP make_pair#define MT make_tuple#define YES(n) cout << ((n) ? "YES" : "NO") << "\n"#define Yes(n) cout << ((n) ? "Yes" : "No") << "\n"#define possible(n) cout << ((n) ? "possible" : "impossible") << "\n"#define Possible(n) cout << ((n) ? "Possible" : "Impossible") << "\n"#define Yay(n) cout << ((n) ? "Yay!" : ":(") << "\n"#define all(v) v.begin(), v.end()#define NP(v) next_permutation(all(v))#define dbg(x) cerr << #x << ":" << x << "\n";#define UNIQUE(v) v.erase(unique(all(v)), v.end())struct io_init {io_init() {cin.tie(nullptr);ios::sync_with_stdio(false);cout << setprecision(30) << setiosflags(ios::fixed);};} io_init;template <typename T>inline bool chmin(T &a, T b) {if (a > b) {a = b;return true;}return false;}template <typename T>inline bool chmax(T &a, T b) {if (a < b) {a = b;return true;}return false;}inline ll CEIL(ll a, ll b) { return (a + b - 1) / b; }template <typename A, size_t N, typename T>inline void Fill(A (&array)[N], const T &val) {fill((T *)array, (T *)(array + N), val);}template <typename T>vector<T> compress(vector<T> &v) {vector<T> val = v;sort(all(val)), val.erase(unique(all(val)), val.end());for (auto &&vi : v) vi = lower_bound(all(val), vi) - val.begin();return val;}template <typename T, typename U>constexpr istream &operator>>(istream &is, pair<T, U> &p) noexcept {is >> p.first >> p.second;return is;}template <typename T, typename U>constexpr ostream &operator<<(ostream &os, pair<T, U> p) noexcept {os << p.first << " " << p.second;return os;}ostream &operator<<(ostream &os, mint m) {os << m.val();return os;}random_device seed_gen;mt19937_64 engine(seed_gen());struct BiCoef {vector<mint> fact_, inv_, finv_;BiCoef(int n) noexcept : fact_(n, 1), inv_(n, 1), finv_(n, 1) {fact_.assign(n, 1), inv_.assign(n, 1), finv_.assign(n, 1);for (int i = 2; i < n; i++) {fact_[i] = fact_[i - 1] * i;inv_[i] = -inv_[MOD % i] * (MOD / i);finv_[i] = finv_[i - 1] * inv_[i];}}mint C(ll n, ll k) const noexcept {if (n < k || n < 0 || k < 0) return 0;return fact_[n] * finv_[k] * finv_[n - k];}mint P(ll n, ll k) const noexcept { return C(n, k) * fact_[k]; }mint H(ll n, ll k) const noexcept { return C(n + k - 1, k); }mint Ch1(ll n, ll k) const noexcept {if (n < 0 || k < 0) return 0;mint res = 0;for (int i = 0; i < n; i++)res += C(n, i) * mint(n - i).pow(k) * (i & 1 ? -1 : 1);return res;}mint fact(ll n) const noexcept {if (n < 0) return 0;return fact_[n];}mint inv(ll n) const noexcept {if (n < 0) return 0;return inv_[n];}mint finv(ll n) const noexcept {if (n < 0) return 0;return finv_[n];}};BiCoef bc(500010);#pragma endregion#pragma region FPS// 引用:// https://opt-cp.com/fps-implementation/#define fastprod 0#define drep2(i, m, n) for (int i = (m)-1; i >= (n); --i)#define drep(i, n) drep2(i, n, 0)template <class T>struct FormalPowerSeries : vector<T> {using vector<T>::vector;using vector<T>::operator=;using F = FormalPowerSeries;F operator-() const {F res(*this);for (auto &e : res) e = -e;return res;}F &operator*=(const T &g) {for (auto &e : *this) e *= g;return *this;}F &operator/=(const T &g) {assert(g != T(0));*this *= g.inv();return *this;}F &operator+=(const F &g) {int n = (*this).size(), m = g.size();repi(i, min(n, m))(*this)[i] += g[i];return *this;}F &operator-=(const F &g) {int n = (*this).size(), m = g.size();repi(i, min(n, m))(*this)[i] -= g[i];return *this;}F &operator<<=(const int d) {int n = (*this).size();(*this).insert((*this).begin(), d, 0);(*this).resize(n);return *this;}F &operator>>=(const int d) {int n = (*this).size();(*this).erase((*this).begin(), (*this).begin() + min(n, d));(*this).resize(n);return *this;}F inv(int d = -1) const {int n = (*this).size();assert(n != 0 && (*this)[0] != 0);if (d == -1) d = n;assert(d > 0);F res{(*this)[0].inv()};while (res.size() < d) {int m = size(res);F f(begin(*this), begin(*this) + min(n, 2 * m));F r(res);f.resize(2 * m), internal::butterfly(f);r.resize(2 * m), internal::butterfly(r);repi(i, 2 * m) f[i] *= r[i];internal::butterfly_inv(f);f.erase(f.begin(), f.begin() + m);f.resize(2 * m), internal::butterfly(f);repi(i, 2 * m) f[i] *= r[i];internal::butterfly_inv(f);T iz = T(2 * m).inv();iz *= -iz;repi(i, m) f[i] *= iz;res.insert(res.end(), f.begin(), f.begin() + m);}return {res.begin(), res.begin() + d};}// fast: FMT-friendly modulus only#if fastprodF &operator*=(const F &g) {int n = (*this).size();*this = convolution(*this, g);(*this).resize(n);return *this;}F &operator/=(const F &g) {int n = (*this).size();*this = convolution(*this, g.inv(n));(*this).resize(n);return *this;}#elseF &operator*=(const F &g) {int n = (*this).size(), m = g.size();drep(i, n) {(*this)[i] *= g[0];REPI(j, 1, min(i + 1, m))(*this)[i] += (*this)[i - j] * g[j];}return *this;}F &operator/=(const F &g) {assert(g[0] != T(0));T ig0 = g[0].inv();int n = (*this).size(), m = g.size();repi(i, n) {REPI(j, 1, min(i + 1, m))(*this)[i] -= (*this)[i - j] * g[j];(*this)[i] *= ig0;}return *this;}#endif// sparseF &operator*=(vector<pair<int, T>> g) {int n = (*this).size();auto [d, c] = g.front();if (d == 0)g.erase(g.begin());elsec = 0;drep(i, n) {(*this)[i] *= c;for (auto &[j, b] : g) {if (j > i) break;(*this)[i] += (*this)[i - j] * b;}}return *this;}F &operator/=(vector<pair<int, T>> g) {int n = (*this).size();auto [d, c] = g.front();assert(d == 0 && c != T(0));T ic = c.inv();g.erase(g.begin());repi(i, n) {for (auto &[j, b] : g) {if (j > i) break;(*this)[i] -= (*this)[i - j] * b;}(*this)[i] *= ic;}return *this;}// multiply and divide (1 + cz^d)void multiply(const int d, const T c) {int n = (*this).size();if (c == T(1))drep(i, n - d)(*this)[i + d] += (*this)[i];else if (c == T(-1))drep(i, n - d)(*this)[i + d] -= (*this)[i];elsedrep(i, n - d)(*this)[i + d] += (*this)[i] * c;}void divide(const int d, const T c) {int n = (*this).size();if (c == T(1))repi(i, n - d)(*this)[i + d] -= (*this)[i];else if (c == T(-1))repi(i, n - d)(*this)[i + d] += (*this)[i];elserepi(i, n - d)(*this)[i + d] -= (*this)[i] * c;}T eval(const T &a) const {T x(1), res(0);for (auto e : *this) res += e * x, x *= a;return res;}void differentiate() {int n = (*this).size();(*this) >>= 1;REPI(i, 1, n - 1)(*this)[i] *= (i + 1);}void integrate(bool ext = true) {if (ext) (*this).push_back(0);int n = (*this).size();(*this) <<= 1;REPI(i, 1, n)(*this)[i] *= bc.inv(i);}F operator*(const T &g) const { return F(*this) *= g; }F operator/(const T &g) const { return F(*this) /= g; }F operator+(const F &g) const { return F(*this) += g; }F operator-(const F &g) const { return F(*this) -= g; }F operator<<(const int d) const { return F(*this) <<= d; }F operator>>(const int d) const { return F(*this) >>= d; }F operator*(const F &g) const { return F(*this) *= g; }F operator/(const F &g) const { return F(*this) /= g; }F operator*(vector<pair<int, T>> g) const { return F(*this) *= g; }F operator/(vector<pair<int, T>> g) const { return F(*this) /= g; }};using fps = FormalPowerSeries<mint>;using sfps = vector<pair<int, mint>>;void add_ext(fps &f, fps &g) {f.resize(max(f.size(), g.size()));f += g;}void prod_ext(fps &f, fps &g) {f.resize(f.size() + g.size() - 1, 0);f *= g;}void prod_ext(fps &f, sfps &g) {int m = 0;for (auto [d, c] : g) {if (m < d) m = d;}f.resize(f.size() + m);f *= g;}#pragma endregionfps Berlekamp_Massey(const fps &a) {int n = a.size();fps c{-1}, c2{0};mint r2 = 1;int i2 = -1;for (int i = 0; i < n; i++) {mint r = 0;int d = c.size();for (int j = 0; j < d; j++) r += c[j] * a[i - j];if (r == 0) continue;mint coef = -r / r2;int d2 = c2.size();if (d - i >= d2 - i2) {for (int j = 0; j < d2; j++) c[j + i - i2] += c2[j] * coef;} else {fps tmp(c);c.resize(d2 + i - i2);for (int j = 0; j < d2; j++) c[j + i - i2] += c2[j] * coef;c2 = std::move(tmp);i2 = i, r2 = r;}}return {c.begin() + 1, c.end()};}// return generating function of a, s.t. F(x) = P(x) / Q(x)std::pair<fps, fps> find_generating_function(fps a) {auto q = Berlekamp_Massey(a);int d = q.size();a.resize(d);q.insert(q.begin(), 1);for (int i = 1; i < (int)q.size(); i++) q[i] *= -1;a *= q;return {a, q};}// return [x^k] p(x) / q(x)mint compute_Kthterm(fps p, fps q, ll k) {int d = q.size();assert(q[0] == 1 and p.size() + 1 <= d);while (k) {auto q_minus = q;for (int i = 1; i < d; i += 2) q_minus[i] *= -1;p.resize(2 * d);q.resize(2 * d);p *= q_minus;q *= q_minus;for (int i = 0; i < d - 1; i++) p[i] = p[(i << 1) | (k & 1)];for (int i = 0; i < d; i++) q[i] = q[i << 1];p.resize(d - 1);q.resize(d);k >>= 1;}return p[0];}mint compute_Kthterm(std::pair<fps, fps> f, ll k) {return compute_Kthterm(f.first, f.second, k);}void solve() {const int m = 10;fps a(m, 0), b(m, 0);a[0] = 1, b[0] = 0;REP(i, 1, m) {a[i] += a[i - 1];if (i >= 2) a[i] += b[i - 2];a[i] *= bc.inv(3);if (i >= 2) b[i] += a[i - 2] * 2 + b[i - 2];b[i] += b[i - 1];b[i] *= bc.inv(3);}auto g = find_generating_function(a);int t;cin >> t;rep(ti, t) {int n;cin >> n;cout << compute_Kthterm(g, n) << "\n";}}int main() { solve(); }