結果
問題 |
No.1255 ハイレーツ・オブ・ボリビアン
|
ユーザー |
👑 ![]() |
提出日時 | 2025-08-25 23:33:16 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 61 ms / 2,000 ms |
コード長 | 14,356 bytes |
コンパイル時間 | 2,682 ms |
コンパイル使用メモリ | 269,124 KB |
実行使用メモリ | 7,716 KB |
最終ジャッジ日時 | 2025-08-25 23:33:21 |
合計ジャッジ時間 | 4,132 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 1 |
other | AC * 15 |
ソースコード
#line 2 "template/template.hpp" using namespace std; // intrinstic #include <immintrin.h> #include <algorithm> #include <array> #include <bitset> #include <cassert> #include <cctype> #include <cfenv> #include <cfloat> #include <chrono> #include <cinttypes> #include <climits> #include <cmath> #include <complex> #include <cstdarg> #include <cstddef> #include <cstdint> #include <cstdio> #include <cstdlib> #include <cstring> #include <deque> #include <fstream> #include <functional> #include <initializer_list> #include <iomanip> #include <ios> #include <iostream> #include <istream> #include <iterator> #include <limits> #include <list> #include <map> #include <memory> #include <new> #include <numeric> #include <ostream> #include <queue> #include <random> #include <set> #include <sstream> #include <stack> #include <streambuf> #include <string> #include <tuple> #include <type_traits> #include <typeinfo> #include <unordered_map> #include <unordered_set> #include <utility> #include <vector> // utility #line 2 "template/utility.hpp" using ll = long long; // a ← max(a, b) を実行する. a が更新されたら, 返り値が true. template<typename T, typename U> inline bool chmax(T &a, const U b){ return (a < b ? a = b, 1: 0); } // a ← min(a, b) を実行する. a が更新されたら, 返り値が true. template<typename T, typename U> inline bool chmin(T &a, const U b){ return (a > b ? a = b, 1: 0); } #line 59 "template/template.hpp" // math #line 2 "template/math.hpp" // 除算に関する関数 // floor(x / y) を求める. template<typename T, typename U> T div_floor(T x, U y){ return (x > 0 ? x / y: (x - y + 1) / y); } // ceil(x / y) を求める. template<typename T, typename U> T div_ceil(T x, U y){ return (x > 0 ? (x + y - 1) / y: x / y) ;} // x を y で割った余りを求める. template<typename T, typename U> T mod(T x, U y){ T q = div_floor(x, y); return x - q * y ; } // x を y で割った商と余りを求める. template<typename T, typename U> pair<T, T> divmod(T x, U y){ T q = div_floor(x, y); return {q, x - q * y}; } // 四捨五入を求める. template<typename T, typename U> T round(T x, U y){ T q, r; tie (q, r) = divmod(x, y); return (r >= div_ceil(y, 2)) ? q + 1 : q; } // 指数に関する関数 // x の y 乗を求める. ll intpow(ll x, ll y){ ll a = 1; while (y){ if (y & 1) { a *= x; } x *= x; y >>= 1; } return a; } // x の y 乗を z で割った余りを求める. ll modpow(ll x, ll y, ll z){ ll a = 1; while (y){ if (y & 1) { (a *= x) %= z; } (x *= x) %= z; y >>= 1; } return a; } // vector の要素の総和を求める. ll sum(vector<ll> &X){ ll y = 0; for (auto &&x: X) { y+=x; } return y; } // vector の要素の総和を求める. template<typename T> T sum(vector<T> &X){ T y = T(0); for (auto &&x: X) { y += x; } return y; } #line 62 "template/template.hpp" // inout #line 1 "template/inout.hpp" // 入出力 template<class... T> void input(T&... a){ (cin >> ... >> a); } void print(){ cout << "\n"; } template<class T, class... Ts> void print(const T& a, const Ts&... b){ cout << a; (cout << ... << (cout << " ", b)); cout << "\n"; } template<typename T, typename U> istream &operator>>(istream &is, pair<T, U> &P){ is >> P.first >> P.second; return is; } template<typename T, typename U> ostream &operator<<(ostream &os, const pair<T, U> &P){ os << P.first << " " << P.second; return os; } template<typename T> vector<T> vector_input(int N, int index){ vector<T> X(N+index); for (int i=index; i<index+N; i++) cin >> X[i]; return X; } template<typename T> istream &operator>>(istream &is, vector<T> &X){ for (auto &x: X) { is >> x; } return is; } template<typename T> ostream &operator<<(ostream &os, const vector<T> &X){ int s = (int)X.size(); for (int i = 0; i < s; i++) { os << (i ? " " : "") << X[i]; } return os; } template<typename T> ostream &operator<<(ostream &os, const unordered_set<T> &S){ int i = 0; for (T a: S) {os << (i ? " ": "") << a; i++;} return os; } template<typename T> ostream &operator<<(ostream &os, const set<T> &S){ int i = 0; for (T a: S) { os << (i ? " ": "") << a; i++; } return os; } template<typename T> ostream &operator<<(ostream &os, const unordered_multiset<T> &S){ int i = 0; for (T a: S) { os << (i ? " ": "") << a; i++; } return os; } template<typename T> ostream &operator<<(ostream &os, const multiset<T> &S){ int i = 0; for (T a: S) { os << (i ? " ": "") << a; i++; } return os; } #line 65 "template/template.hpp" // macro #line 2 "template/macro.hpp" // マクロの定義 #define all(x) x.begin(), x.end() #define len(x) ll(x.size()) #define elif else if #define unless(cond) if (!(cond)) // オーバーロードマクロ #define overload2(_1, _2, name, ...) name #define overload3(_1, _2, _3, name, ...) name #define overload4(_1, _2, _3, _4, name, ...) name #define overload5(_1, _2, _3, _4, _5, name, ...) name // 繰り返し系 #define rep1(n) for (ll i = 0; i < n; i++) #define rep2(i, n) for (ll i = 0; i < n; i++) #define rep3(i, a, b) for (ll i = a; i < b; i++) #define rep4(i, a, b, c) for (ll i = a; i < b; i += c) #define rep(...) overload4(__VA_ARGS__, rep4, rep3, rep2, rep1)(__VA_ARGS__) #define foreach1(x, a) for (auto &&x: a) #define foreach2(x, y, a) for (auto &&[x, y]: a) #define foreach3(x, y, z, a) for (auto &&[x, y, z]: a) #define foreach4(x, y, z, w, a) for (auto &&[x, y, z, w]: a) #define foreach(...) overload5(__VA_ARGS__, foreach4, foreach3, foreach2, foreach1)(__VA_ARGS__) #line 2 "Modulo/Order.hpp" #line 2 "Modulo/Modulo.hpp" #line 4 "Modulo/Modulo.hpp" namespace Modulo { class DifferentModulus : public exception { public: // publicに指定 const char* what() const noexcept override { return "異なる法同士の四則演算です"; } }; struct Modulo { long long a, n; public: // 初期化 Modulo(): a(0), n(1) {} Modulo(long long a, long long n): a((a % n + n) % n), n(n) {} // マイナス元 Modulo operator-() const { return Modulo(-a, n); } // 加法 Modulo& operator+=(const Modulo &y) { if (n != y.n) { throw DifferentModulus(); } if ((a += y.a) >= n) a -= n; return *this; } Modulo& operator+=(const long long &y) { return (*this) += Modulo(y, n); } friend Modulo operator+(const Modulo &x, const Modulo &y) { return Modulo(x) += y ; } friend Modulo operator+(const Modulo &x, const long long &a) { return x + Modulo(a, x.n); } friend Modulo operator+(const long long &a, const Modulo &x) { return Modulo(a, x.n) + x; } // 減法 Modulo& operator-=(const Modulo &y) { if (n != y.n) { throw DifferentModulus(); } if ((a += (n - y.a)) >= n) a -= n; return *this; } Modulo& operator-=(const long long &y) { return (*this) -= Modulo(y, n); } friend Modulo operator-(const Modulo &x, const Modulo &y) { return Modulo(x) -= y; } friend Modulo operator-(const Modulo &x, const long long &a) { return x - Modulo(a, x.n); } friend Modulo operator-(const long long &a, const Modulo &x) { return Modulo(a, x.n) - x; } // 乗法 Modulo& operator*=(const Modulo &y) { if (n != y.n) { throw DifferentModulus(); } (a *= y.a) %= n; return *this; } Modulo& operator*=(const long long &y){return (*this) *= Modulo(y, n); } friend Modulo operator*(const Modulo &x, const Modulo &y) { return Modulo(x) *= y; } friend Modulo operator*(const Modulo &x, const long long &a) { return x * Modulo(a,x.n); } friend Modulo operator*(const long long &a, const Modulo &x) { return Modulo(a, x.n) * x; } // 除法 Modulo& operator/=(const Modulo &y){ if (n != y.n) { throw DifferentModulus(); } return (*this) *= y.inverse(); } Modulo& operator/=(const long long &y) {return (*this ) /= Modulo(y, n); } friend Modulo operator/(const Modulo &x, const Modulo &y) { return Modulo(x) /= y; } friend Modulo operator/(const Modulo &x, const long long &a) { return x / Modulo(a, x.n); } friend Modulo operator/(const long long &a, const Modulo &x) { return Modulo(a, x.n) / x; } // 退化 Modulo& degenerate(const int m){ a %= m; n = m; return *this; } // モジュラー逆元 bool invertible() const { long long x = a, y = n; while (y) { swap(x = x % y, y); } return x == 1; } Modulo inverse() const{ long long s = 1, t = 0; long long x = a, y = n; while (y){ auto q = x / y; swap(x -= q * y, y); swap(s -= q * t, t); } return Modulo(s, n); } // include? bool is_member(ll x) { return mod(x - a, n) == 0; } bool is_zero() { return is_member(0); } // 比較 friend bool operator==(const Modulo &x, const Modulo &y) { return x.a==y.a; } friend bool operator==(const Modulo &x, const long long &a) { return (x.a - a) % x.n == 0; } friend bool operator==(const long long &a, const Modulo &x) { return (a - x.a) % x.n == 0; } friend bool operator!=(const Modulo &x, const Modulo &y) { return x.a != y.a; } friend bool operator!=(const Modulo &x, const long long &a) { return (x.a - a)% x.n != 0; } friend bool operator!=(const long long &a, const Modulo &x) { return (a - x.a)% x.n != 0; } // 入力 friend istream &operator>>(istream &is, Modulo &x) { long long b, m; is >> b >> m; x = Modulo(b, m); return (is); } // 出力 friend ostream &operator<<(ostream &os, const Modulo &x) { return os << x.a << " (mod " << x.n << ")"; } }; Modulo pow(Modulo x, long long n) { if (n < 0) { return pow(x, -n).inverse(); } auto res = Modulo(1, x.n); for (; n; n >>= 1) { if (n & 1) { res *= x; } x *= x; } return res; } } #line 2 "Integer/Euler_Totient.hpp" #line 2 "Integer/Prime.hpp" namespace Prime { class Pseudo_Prime_Generator { private: long long prime = 1, step = 0; public: long long get() { if (step) { prime += step; step = 6 - step; } else if (prime == 1) { prime = 2; } else if (prime == 2) { prime = 3; } else if (prime == 3) { prime = 5, step = 2; } return prime; } }; // n は素数? bool is_prime(long long n) { if (n <= 3) { return n >= 2; } else if (n == 5) { return true; } else if ((n % 2 == 0) || (n % 3 == 0) || (n % 5 == 0)) { return false; } Pseudo_Prime_Generator generator; for (long long p = generator.get(); p * p <= n; p = generator.get()) { if (n % p == 0) { return false; } } return true; } pair<long long, long long> exponents(long long n, long long p) { long long e = 0; while (n % p == 0) { e++, n /= p; } return {e, n}; } // 素因数分解 vector<pair<long long, long long>> prime_factorization (long long n) { if (n == 0) { return { make_pair(0, 0) }; } vector<pair<long long, long long>> factors; if (n < 0) { factors.emplace_back(make_pair(-1, 1)); n = abs(n); } Pseudo_Prime_Generator generator; for (long long p =generator.get(); p * p <= n; p = generator.get()) { long long e; tie(e, n) = exponents(n, p); if (e) { factors.emplace_back(make_pair(p, e)); } } if (n > 1) { factors.emplace_back(make_pair(n, 1)); } return factors; } // n 以下の素数のリストを作成する. vector<long long> prime_list(long long n) { if (n == 0 || n == 1) { return {}; } else if (n == 2) { return {2}; } if (n % 2 == 0) { n--; } long long m = (n + 1) / 2; // prime_flag[k] := (2k+1) は素数か? vector<bool> prime_flag(m, true); prime_flag[0] = false; // 9 以上の 3 の倍数を消す. for (long long x = 4; x < m; x += 3) { prime_flag[x] = false; } auto generator = Pseudo_Prime_Generator(); for (auto p = generator.get(); p * p <= n; p = generator.get()) { if (p <= 3) { continue; } if (!prime_flag[(p - 1) / 2]) { continue; } for (auto j = (p * p - 1) / 2; j < m; j += p) { prime_flag[j] = false; } } vector<long long> primes{2}; for (long long k = 0; k < m; k++) { if (prime_flag[k]) { primes.emplace_back(2 * k + 1); } } return primes; } } #line 4 "Integer/Euler_Totient.hpp" long long Euler_Totient(long long N, bool mode = true) { if (N == 1) { return mode ? 1 : 0; } long long phi = 1; for (auto &&[p, e]: Prime::prime_factorization(N)) { phi *= p - 1; for (int k = 0; k < e - 1; k++) { phi *= p; } } return phi; } #line 2 "Integer/Divisors.hpp" #line 4 "Integer/Divisors.hpp" // N 以下の約数を列挙 vector<ll> Divisors(ll N) { vector<ll> divisors; for (int x = 1; x * x <= N; x++){ unless(N % x == 0) { continue; } divisors.emplace_back(x); if (N / x != x) { divisors.emplace_back(N / x); } } sort(all(divisors)); return divisors; } #line 6 "Modulo/Order.hpp" namespace Modulo { // X の位数を求める ll Order(const Modulo &X, ll irreversible = -1) { ll phi = Euler_Totient(X.n); ll a = X.n + 1; for (ll k = 1; k * k <= phi; k++) { unless(phi % k == 0) { continue; } if (k < a && pow(X, k).is_member(1)) { return k; } if (phi / k < a && pow(X, phi / k).is_member(1)) { a = phi / k; } } return a < X.n + 1 ? a : irreversible; } } #line 3 "jam.cpp" int main() { int T; cin >> T; for (int t = 1; t <= T; t++) { ll N; cin >> N; cout << Modulo::Order(Modulo::Modulo(2, 2 * N - 1)) << endl; } }