結果
問題 | No.1664 Unstable f(n) |
ユーザー | π |
提出日時 | 2021-09-03 23:28:09 |
言語 | C++23 (gcc 12.3.0 + boost 1.83.0) |
結果 |
WA
|
実行時間 | - |
コード長 | 32,070 bytes |
コンパイル時間 | 1,714 ms |
コンパイル使用メモリ | 130,244 KB |
実行使用メモリ | 6,824 KB |
最終ジャッジ日時 | 2024-12-15 18:23:51 |
合計ジャッジ時間 | 2,776 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge3 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 2 ms
6,816 KB |
testcase_01 | AC | 2 ms
6,816 KB |
testcase_02 | AC | 1 ms
6,820 KB |
testcase_03 | WA | - |
testcase_04 | WA | - |
testcase_05 | WA | - |
testcase_06 | AC | 1 ms
6,816 KB |
testcase_07 | AC | 1 ms
6,820 KB |
testcase_08 | AC | 1 ms
6,816 KB |
testcase_09 | AC | 1 ms
6,816 KB |
testcase_10 | AC | 1 ms
6,820 KB |
testcase_11 | AC | 1 ms
6,820 KB |
testcase_12 | AC | 1 ms
6,816 KB |
testcase_13 | AC | 1 ms
6,816 KB |
testcase_14 | AC | 1 ms
6,820 KB |
testcase_15 | AC | 1 ms
6,816 KB |
testcase_16 | AC | 1 ms
6,820 KB |
testcase_17 | AC | 2 ms
6,816 KB |
testcase_18 | WA | - |
testcase_19 | WA | - |
testcase_20 | AC | 1 ms
6,816 KB |
testcase_21 | AC | 2 ms
6,816 KB |
testcase_22 | AC | 2 ms
6,820 KB |
testcase_23 | AC | 2 ms
6,820 KB |
testcase_24 | AC | 2 ms
6,816 KB |
testcase_25 | AC | 2 ms
6,820 KB |
testcase_26 | AC | 1 ms
6,816 KB |
testcase_27 | AC | 1 ms
6,816 KB |
testcase_28 | AC | 1 ms
6,816 KB |
testcase_29 | AC | 1 ms
6,820 KB |
testcase_30 | AC | 2 ms
6,820 KB |
testcase_31 | WA | - |
testcase_32 | WA | - |
testcase_33 | WA | - |
testcase_34 | WA | - |
testcase_35 | WA | - |
testcase_36 | WA | - |
testcase_37 | AC | 1 ms
6,820 KB |
testcase_38 | WA | - |
testcase_39 | AC | 1 ms
6,816 KB |
testcase_40 | AC | 1 ms
6,816 KB |
ソースコード
#define NDEBUG 1 //#pragma GCC optimize("O3") #pragma GCC target("avx") //#pragma GCC optimize("unroll-loops") #define FOR(i, s, e) for(auto i = (s); i < (e); ++i) #define REP(i, e) FOR(i, decltype(e)(), (e)) #define ALL(x) (std::begin(x)),(std::end(x)) #ifndef MOD #define MOD 1000000007 #endif // ! MOD #include <cstdint> #include <cstddef> #include <limits> #if __cplusplus > 201703L && __cpp_concepts >= 201907L #include <concepts> #else #include <type_traits> #define NO_CONCEPT #endif // __has_include(<concepts>) #include <iterator> #include <utility> #include <algorithm> #include <initializer_list> #include <tuple> #include <string_view> #include <string> #include <array> #include <vector> #include <deque> #include <unordered_set> #include <unordered_map> #include <forward_list> #include <list> #include <stack> #include <queue> namespace nlib { #ifdef NO_CONCEPT template <class T, class U> struct is_super_type : std::conjunction<std::is_same<std::common_type_t<T, U>, T>, std::is_same<std::common_type_t<T, U>, std::common_type_t<U, T>>> {}; template <class T, class U> inline constexpr bool is_super_type_v = is_super_type<T, U>::value; #else template <class T, class U> concept super_type = std::same_as<std::common_type_t<T, U>, T> && std::same_as<std::common_type_t<U, T>, T>; #endif // NO_CONCEPT namespace { using swallow = std::initializer_list<int>; } // namespace using uint = unsigned; using ll = long long; using ull = unsigned long long; using ld = long double; template <class T> using vector = std::vector<T>; template <class T> using deque = std::deque<T>; template <class T> using unordered_set = std::unordered_set<T>; template <class T, class U> using unordered_map = std::unordered_map<T, U>; template <class T> using forward_list = std::forward_list<T>; template <class T> using list = std::list<T>; template <class T, class Container = deque<T>> using stack = std::stack<T, Container>; template <class T, class Container = deque<T>> using queue = std::queue<T, Container>; template <class T, class Container = vector<T>, class Compare = std::less<typename Container::value_type>> using priority_queue = std::priority_queue<T, Container, Compare>; template <class T, size_t n> using array = std::array<T, n>; using string = std::string; using string_view = std::string_view; template <class T> using vecvec = vector<vector<T>>; using vi = vector<int>; template <size_t n> using ai = array<int, n>; template<class T> using vvi = vecvec<int>; template <size_t n> using vai = vector<array<int, n>>; template <size_t n, size_t m = n> using aai = array<array<int, m>, n>; using vl = vector<ll>; template <size_t n> using al = array<ll, n>; using vvl = vecvec<ll>; template <size_t n> using val = vector<array<ll, n>>; template <size_t n, size_t m = n> using aal = array<array<ll, m>, n>; using vs = vector<string>; template <size_t n> using as = array<string, n>; template <size_t n> using asv = array<string_view, n>; using namespace std::literals; inline constexpr string_view alnums = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"sv; inline constexpr string_view digits = alnums.substr(0, 10); inline constexpr string_view l_alphas = alnums.substr(10, 26); inline constexpr string_view g_alphas = alnums.substr(36, 26); inline constexpr string_view alphas = alnums.substr(10, 52); inline constexpr auto mod = MOD; } // namespace nlib #include <cmath> namespace nlib { template <class T = int, class U = ll, T m = mod> class mod_int { T _value; public: static constexpr T mod = m; // TODO /* static constexpr mod_int get_inverse(T v) { } constexpr mod_int& inverse() { value = get_inverse(value); return *this; } */ constexpr mod_int() noexcept = default; constexpr mod_int(const mod_int& v) noexcept = default; constexpr mod_int(mod_int&& v) noexcept = default; constexpr mod_int(const T& v) noexcept: _value(static_cast<T>(v) % mod) { if(_value < 0) _value += mod; } #ifdef NO_CONCEPT template<class X, class = std::enable_if_t<!is_super_type_v<T, X>>> #else template<class X> requires (!super_type<T, X>) #endif // ! NO_CONCEPT constexpr mod_int(const X& v) noexcept: _value(static_cast<T>(v % static_cast<X>(mod))) { if(_value < 0) _value += mod; } #if __cplusplus > 201703L constexpr #endif // c++2a ~mod_int() noexcept = default; constexpr operator T() const noexcept {return _value;} #define DEFOP(op) constexpr mod_int& operator op noexcept DEFOP(=(const mod_int& v) &) = default; DEFOP(=(mod_int&& v) &) = default; DEFOP(++()) { if(_value == std::numeric_limits<mod_int>::max()) _value = 0; else ++_value; return *this; } DEFOP(--()) { if(_value == 0) _value = std::numeric_limits<mod_int>::max(); else --_value; return *this; } DEFOP(+=(const mod_int& v)) { if((_value += v._value) >= mod) _value -= mod; return *this; } DEFOP(-=(const mod_int& v)) { if((_value -= v._value) < 0) _value += mod; return *this; } DEFOP(*=(const mod_int& v)) { _value = static_cast<T>((static_cast<U>(_value) * static_cast<U>(v._value)) % static_cast<U>(mod)); return *this; } DEFOP(/=(const mod_int& v)) { return *this *= inverse(v._value); } DEFOP(%=(const mod_int& v)) { return *this %= v._value; } #undef DEFOP #define DEFOP(op) constexpr mod_int operator op noexcept DEFOP(++(int)) {mod_int v = *this; ++(*this); return v;} DEFOP(--(int)) {mod_int v = *this; --(*this); return v;} DEFOP(+() const) {return *this;} DEFOP(-() const) {mod_int mint; if(_value) mint._value = mod - _value; return mint;} #undef DEFOP explicit constexpr operator bool() const noexcept {return _value;} constexpr bool operator!() const noexcept {return !_value;} #define MINT_T class X, class Y, X x #define MINT mod_int<X, Y, x> #define TEMPL template <MINT_T> #ifdef NO_CONCEPT #define TEMPL_CONV template <MINT_T, class I> #else #define TEMPL_CONV template <MINT_T, class I> requires (std::convertible_to<I, MINT>) #endif // NO_CONCEPT #ifdef NO_CONCEPT #define CONV_R(...) std::enable_if_t<std::is_convertible_v<I, MINT>, __VA_ARGS__> #else #define CONV_R(...) __VA_ARGS__ #endif // NO_CONCEPT #define DECOP(r, op) \ TEMPL friend constexpr r operator op(const MINT&, const MINT&) noexcept; \ TEMPL_CONV friend constexpr CONV_R(r) operator op(const MINT&, const I&) noexcept; \ TEMPL_CONV friend constexpr CONV_R(r) operator op(const I&, const MINT&) noexcept; DECOP(MINT, +) DECOP(MINT, -) DECOP(MINT, *) DECOP(MINT, /) DECOP(MINT, %) DECOP(bool, ==) DECOP(bool, !=) DECOP(bool, <) DECOP(bool, >) DECOP(bool, <=) DECOP(bool, >=) #undef DECOP #undef MINT }; } // namespace nlib #define MINT nlib::mod_int<X, Y, x> #define DEFOP(ret, op, exp0, exp1, exp2) \ TEMPL constexpr ret operator op(const MINT& l, const MINT& r) noexcept {return exp0;} \ TEMPL_CONV constexpr CONV_R(ret) operator op(const MINT& l, const I& r) noexcept {return exp1;} \ TEMPL_CONV constexpr CONV_R(ret) operator op(const I& l, const MINT& r) noexcept {return exp2;} #define DEFOP_A(op) DEFOP(MINT, op, MINT(l) op##= r, MINT(r) op##= l, MINT(l) op##= r) DEFOP_A(+) DEFOP_A(-) DEFOP_A(*) DEFOP_A(/) DEFOP_A(%) #undef DEFOP_A #define DEFOP_C(op) DEFOP(bool, op, l._value op r._value, l._value op MINT(r)._value, MINT(l)._value op r._value) DEFOP_C(==) DEFOP_C(!=) DEFOP_C(<) DEFOP_C(>) DEFOP_C(<=) DEFOP_C(>=) #undef DEFOP_C #undef DEFOP #undef CONV_R #undef TEMPL_CONV namespace std { TEMPL struct is_integral<MINT> : true_type {}; TEMPL struct is_signed<MINT> : false_type {}; TEMPL struct numeric_limits<MINT> : numeric_limits<X> { static constexpr MINT min() noexcept {return 0;} static constexpr MINT lowest() noexcept {return 0;} static constexpr MINT max() noexcept {return x - 1;} static constexpr int digits10 = std::floor(std::log10<X>(static_cast<X>(max()))); static constexpr bool is_signed = false; static constexpr bool is_modulo = true; }; } // namespace std #undef MINT #undef TEMPL #undef MINT_T #include <unistd.h> #include <cstring> #include <cmath> namespace nlib { #ifndef NO_CONCEPT template <class T> concept integer_class = std::integral<T> && !std::same_as<T, char> && !std::same_as<T, bool>; template <class T> concept container_input_or_output = requires(const T x) { std::begin(x); std::end(x); requires std::sentinel_for<decltype(std::end(x)), decltype(std::begin(x))>; }; template <class T> concept container_forward = container_input_or_output<T> && requires(const T x) { {std::begin(x)} -> std::forward_iterator; }; template <class T> concept container_output = container_input_or_output<T> && requires(T x) { requires std::output_iterator<decltype(std::begin(x)), typename std::iterator_traits<decltype(std::begin(x))>::value_type>; }; template <class T> concept string_output = container_input_or_output<T> && requires(T& x, const char* s, const char* e) { requires std::same_as<typename std::iterator_traits<decltype(std::begin(x))>::value_type, char>; {x.clear()} noexcept; x.insert(std::end(x), s, e); }; template <class T> concept string_input = requires(T& x) { {std::data(x)} noexcept -> std::convertible_to<const char*>; {std::size(x)} noexcept -> std::convertible_to<size_t>; }; template <class... Args> concept noonly_one = requires() { requires sizeof...(Args) != 1; }; #endif // NO_CONCEPT inline constexpr char endl = '\n'; inline constexpr char wspc = ' '; class reader { public: static constexpr size_t max_size = 4096; private: char buf[max_size]; size_t buf_size = 0, pt = 0; int fd = -1; public: reader() noexcept = default; reader(const reader&) = delete; reader(reader&&) noexcept = default; reader(int open_fd) noexcept : fd(open_fd) {} reader& operator=(const reader&) noexcept = delete; reader& operator=(reader&&) noexcept = default; void open(int open_fd) noexcept { if(fd != -1) fd = open_fd; } size_t read(char* str, size_t size) noexcept { ssize_t s = ::read(fd, str, size); return s == -1 ? 0 : size_t(s); } bool check() noexcept {return pt >= buf_size && reread();} bool reread() noexcept {if(buf_size >= max_size) {buf_size = 0;} pt = buf_size; buf_size += read(buf, max_size - pt); return buf_size == pt;} size_t size() const noexcept {return buf_size - pt;} bool getc(char& c) noexcept {if(check()) {return true;} c = buf[pt++]; return false;} template <class T> #ifdef NO_CONCEPT auto #else requires string_output<T> bool #endif // NO_CONCEPT getline(T& s) noexcept # ifdef NO_CONCEPT -> decltype(std::begin(s), std::end(s), (s).clear(), s.insert(std::end(s), buf + pt, buf + pt), *this) # endif // NO_CONCEPT { s.clear(); if(check()) return true; size_t p = pt; for(;;) { if(p == buf_size) { s.insert(std::end(s), buf + pt, buf + p); if(buf_size != max_size || reread()) return true; p = 0; } else if(buf[p] == endl) { s.insert(std::end(s), buf + pt, buf + p); pt = p + 1; return false; } ++p; } } bool readspace() noexcept { if(check()) return true; while(buf[pt] == wspc || buf[pt] == endl) { ++pt; if(pt == buf_size && (buf_size != max_size || reread())) return true; } return false; } #ifndef NO_SCAN reader& scan(char& c) noexcept {if(getc(c)) c = '\0'; return *this;} template <class T> # ifdef NO_CONCEPT std::enable_if_t<std::is_integral_v<T> && (!std::is_same_v<T, char>) && (!std::is_same_v<T, bool>), reader&> # else requires integer_class<T> reader& # endif // NO_CONCEPT scan(T& n) noexcept { constexpr T ten = 10; n = T(); if(readspace()) return *this; bool sign = false; switch(buf[pt]) { case '-': sign = true; [[fallthrough]]; case '+': ++pt; if(check()) return *this; } while('0' <= buf[pt] && buf[pt] <= '9') { n *= ten; n += T(buf[pt++] - '0'); if(check()) goto end; } end: if(sign) n = -n; return *this; } template <class T> # ifdef NO_CONCEPT std::enable_if_t<std::is_floating_point_v<T>, reader&> # else requires std::floating_point<T> reader& # endif // NO_CONCEPT scan(T& n) noexcept { constexpr T ten = 10; n = T(); if(readspace()) return *this; bool sign = false; switch(buf[pt]) { case '-': sign = true; [[fallthrough]]; case '+': ++pt; if(check()) return *this; } while('0' <= buf[pt] && buf[pt] <= '9') { n *= ten; n += T(buf[pt++] - '0'); if(check()) goto end; } if(buf[pt] == '.') { ++pt; if(check()) goto end; T pow10 = 1; while('0' <= buf[pt] && buf[pt] <= '9') { pow10 *= ten; if(std::isinf<T>(pow10)) { do { ++pt; } while(!check() && '0' <= buf[pt] && buf[pt] <= '9'); goto end; } n += T(buf[pt++] - '0') / pow10; if(check()) goto end; } } end: if(sign) n = -n; return *this; } template <class C> # ifdef NO_CONCEPT auto # else requires (container_output<C> && !string_output<C>) reader& # endif // NO_CONCEPT scan(C& v) noexcept # ifdef NO_CONCEPT -> decltype(std::begin(v), std::end(v), *this) # endif // NO_CONCEPT {for(auto& e : v) scan(e); return *this;} template <class T, size_t N> # ifdef NO_CONCEPT std::enable_if_t<is_super_type_v<char, T>, reader&> # else requires (!string_output<T[N]>) reader& # endif // NO_CONCEPT scan(T (&v)[N]) noexcept {for(T& e : v) scan(e); return *this;} template <class T> # ifdef NO_CONCEPT auto # else requires string_output<T> reader& # endif // ! NO_CONCEPT scan(T& s) noexcept # ifdef NO_CONCEPT -> std::enable_if_t<!std::is_same_v<std::iterator_traits<decltype(std::begin(s))>::value_type, char>, decltype(std::end(s), (s).clear(), s.insert(std::end(s), buf + pt, buf + pt), *this)> # endif // NO_CONCEPT { s.clear(); if(check()) return *this; size_t p = pt; for(;;) { if(p == buf_size) { s.insert(std::end(s), buf + pt, buf + p); if(buf_size != max_size || reread()) return *this; p = 0; } else if(buf[p] == wspc || buf[p] == endl) { s.insert(std::end(s), buf + pt, buf + p); pt = p + 1; return *this; } ++p; } return *this; } template <class... Args> # ifdef NO_CONCEPT std::enable_if_t<sizeof...(Args) != 1, reader&> # else requires noonly_one<Args...> reader& # endif // NO_CONCEPT scan(Args&... args) noexcept {(void)swallow{(scan(args), 0)...}; return *this;} #endif // ! NO_SCAN }; #ifndef UNSET_STDIN reader rd(0); # ifndef NO_SCAN template <class... Args> reader& scan(Args&... args) noexcept {return rd.scan(args...);} template <class T> T get_v() noexcept {T x; scan(x); return x;} template <class T> T&& get_v(T&& x) noexcept {scan(x); return std::move(x);} # endif // ! NO_SCAN #endif // ! UNSET_STDIN class writer { public: static constexpr size_t max_size = 4096; private: char buf[max_size]; size_t pt = 0; int fd = -1; #ifndef NO_PRINT bool iscontinued = false; #endif // ! NO_PRINT public: writer() noexcept = default; writer(const writer&) = delete; writer(writer&&) noexcept = default; writer(int open_fd) noexcept : fd(open_fd) {} ~writer() noexcept {write(buf, pt);} writer& operator=(const writer&) = delete; writer& operator=(writer&&) & noexcept = default; void write(const char* str, size_t size) noexcept { ::write(fd, str, size); } void flush() noexcept { write(buf, pt); pt = 0; } void reopen(int open_fd) noexcept { if(pt) flush(); fd = open_fd; } void check() noexcept { if(pt >= max_size) { write(buf, max_size); pt = 0; } } void putc(const char& c) noexcept {buf[pt] = c;++pt;check();} void puts(const char* str, size_t len) noexcept { if(!len) return; size_t write_size = max_size - pt; size_t copy_size = len; if(copy_size <= write_size) { memcpy(buf + pt, str, copy_size); pt += copy_size; check(); } else { if(pt) { memcpy(buf + pt, str, write_size); write(buf, max_size); } else { write_size = 0; } if(len > max_size && (copy_size = ((copy_size - write_size) / max_size) * max_size)) { write(str + write_size, copy_size); write_size += copy_size; } copy_size = len - write_size; memcpy(buf, str + write_size, copy_size); pt = copy_size + 1; } } void putcs(char&& ch, size_t len) noexcept { if(!len) return; size_t write_size = max_size - pt; size_t copy_size = len; if(copy_size <= write_size) { memset(buf + pt, ch, copy_size); pt += copy_size; check(); } else { if(pt) { memset(buf + pt, ch, write_size); write(buf, max_size); } else { write_size = 0; } if(len > max_size && (copy_size = (copy_size - write_size) / max_size)) { memset(buf, ch, max_size - pt); REP(i, copy_size) write(buf, max_size); write_size += copy_size * max_size; } copy_size = len - write_size; memset(buf, ch, copy_size); pt = copy_size + 1; } } #ifndef NO_PRINT template<bool nonewline = true> void writespace() noexcept { if(iscontinued) { if constexpr(nonewline) putc(wspc); else putc(endl); } iscontinued = nonewline; } writer& print(const char& c) noexcept {if(c) {if(c == endl) iscontinued = false; putc(c);} else {iscontinued = false;} return *this;} template <class T> # ifdef NO_CONCEPT std::enable_if_t<std::is_integral_v<T> && (!std::is_same_v<T, char>) && (!std::is_same_v<T, bool>), writer&> # else requires integer_class<T> writer& # endif // NO_CONCEPT print(T n) noexcept { constexpr int len = std::numeric_limits<T>::digits10 + 1; constexpr T ten = T(10); writespace(); if constexpr(std::is_signed_v<T>) { if(n < 0) { putc('-'); n = -n; } else if(!n) { putc('0'); return *this; } } else { if(!n) { putc('0'); return *this; } } char s[len]; size_t i = len; while(n) { --i; s[i] = char(n % ten) + '0'; n /= ten; } puts(s + i, len - i); return *this; } template <class T, class U, T m> writer& print(mod_int<T, U, m> n) noexcept { return print(static_cast<T>(n)); } template <class T> # ifdef NO_CONCEPT std::enable_if_t<std::is_floating_point_v<T>, writer&> # else requires std::floating_point<T> writer& # endif // NO_CONCEPT print(T n) noexcept { constexpr int len = std::numeric_limits<T>::digits10 + 1; constexpr T ten = T(10); writespace(); if constexpr(std::is_signed_v<T>) { if(n < T()) { putc('-'); n = -n; } else if(!n) { putc('0'); return *this; } } else { if(!n) { putc('0'); return *this; } } char s[len]; int lo = int(std::floor(std::log10(n))); int i = 0; while(i < len) { int a; n = std::remquo(n, std::pow<T>(ten, lo - i), &a); if(a < 0) { a += 10; --s[i - 1]; } s[i] = std::move(a) + '0'; ++i; } if(lo >= 0) { ++lo; if(lo < len) { puts(s, lo); putc('.'); puts(s + lo, len - lo); } else { puts(s, len); lo -= len; if(lo) putcs('0', lo); } } else { putc('0'),putc('.'); putcs('0', -lo); puts(s, len); } return *this; } template <class C> # ifdef NO_CONCEPT auto #else requires (container_forward<C> && !string_input<C>) writer& # endif // ! NO_CONCEPT print(const C& v) noexcept # ifdef NO_CONCEPT -> decltype(std::begin(v), std::end(v), *this) # endif // NO_CONCEPT {for(const auto& e : v) print(e); return *this;} template <class T, size_t N> # ifdef NO_CONCEPT std::enable_if_t<!std::is_same_v<T, char>, writer&> # else requires (!string_input<T[N]>) writer& # endif // NO_CONCEPT print(const T (&v)[N]) noexcept {for(const T& e : v) print(e); return *this;} template <class T> # ifdef NO_CONCEPT auto #else requires string_input<T> writer& # endif // NO_CONCEPT print(const T& s) noexcept # ifdef NO_CONCEPT -> decltype(static_cast<const char*>(std::data(s)), static_cast<size_t>(std::size(s)), *this) # endif // NO_CONCEPT { const char* const ptr = std::data(s); const size_t len = std::size(s); if(len == 0 || (len == 1 && !(*ptr))) { iscontinued = false; return *this; } puts(ptr, len); if(*(ptr + len - 1) == endl) { iscontinued = false; } return *this; } template <class T1, class T2> writer& print(std::pair<T1, T2>&& p) noexcept { print(std::forward<T1>(p.first)), print(std::forward<T2>(p.second)); return *this; } template <class... Args> writer& print(std::tuple<Args...>&& t) noexcept { return std::apply(print, std::forward<std::tuple<Args...>>(t)); } template <class... Args> # ifdef NO_CONCEPT std::enable_if_t<sizeof...(Args) != 1, writer&> # else requires noonly_one<Args...> writer& # endif // NO_CONCEPT print(Args&&... args) noexcept {(void)swallow{(print(std::forward<Args>(args)), 0)...}; return *this;} template <class... Args> writer& println(Args&&... args) noexcept {writespace<false>(); print(std::forward<Args>(args)...); writespace<false>(); return *this;} #endif // ! NO_PRINT }; #ifndef UNSET_STDOUT writer wt(1); # ifndef NO_PRINT template <class... Args> writer& print(Args&&... args) noexcept {return wt.print(std::forward<Args>(args)...);} template <class... Args> writer& println(Args&&... args) noexcept {return wt.println(std::forward<Args>(args)...);} # endif // ! NO_PRINT # ifndef NDEBUG writer errwt(2); # ifndef NO_PRINT template <class... Args> void dprint(Args&&... args) noexcept {errwt.print(std::forward<Args>(args)...).flush();} template <class... Args> void dprintln(Args&&... args) noexcept {errwt.println(std::forward<Args>(args)...).flush();} # endif // ! NO_PRINT # else # ifndef NO_PRINT template <class... Args> void dprint(Args&&...) noexcept {} template <class... Args> void dprintln(Args&&...) noexcept {} # endif // ! NO_PRINT # endif // ! NDEBUG #endif // ! UNSET_STDOUT } // namespace nlib #include <numeric> #include <cmath> namespace nlib { #ifndef NO_CONCEPT template <class T> concept lessthan = requires(const T a, const T b) { a < b; }; #endif // ! NO_CONCEPT template <class T> #ifndef NO_CONCEPT requires std::unsigned_integral<T> #endif // ! NO_CONCEPT constexpr T combination(T, T); template <class T> #ifndef NO_CONCEPT requires lessthan<T> #endif // ! NO_CONCEPT constexpr T& chmin(T& a, const T& b) {if(b < a) a = b; return a;} template <class T, class Compare> #ifndef NO_CONCEPT requires std::predicate<Compare, const T&, const T&> #endif // ! NO_CONCEPT constexpr T& chmin(T& a, const T& b, Compare comp) {if(comp(b, a)) a = b; return a;} template <class T> #ifndef NO_CONCEPT requires lessthan<T> #endif // ! NO_CONCEPT constexpr T& chmax(T& a, const T& b) {if(a < b) a = b; return a;} template <class T, class Compare> #ifndef NO_CONCEPT requires std::predicate<Compare, const T&, const T&> #endif // ! NO_CONCEPT constexpr T& chmax(T& a, const T& b, Compare comp) {if(comp(a, b)) a = b; return a;} template <class T> #ifndef NO_CONCEPT requires lessthan<T> #endif // ! NO_CONCEPT constexpr void chminmax(T& a, T& b) {if(b < a) std::swap(a, b);} template <class T, class Compare> #ifndef NO_CONCEPT requires std::predicate<Compare, const T&, const T&> #endif // ! NO_CONCEPT constexpr void chminmax(T& a, T& b, Compare comp) {if(comp(b, a)) std::swap(a, b);} template <class T> class pow_preproc { using array_t = T[std::numeric_limits<T>::digits]; array_t _dp = {}; public: const T base; constexpr pow_preproc(T b) : base(b) { _dp[0] = b; FOR(i, 1, std::numeric_limits<T>::digits) { _dp[i] = _dp[i - 1] * _dp[i - 1]; } } constexpr T operator[](int x) { return x ? _dp[x - 1] : 1; } constexpr T get_pow(T x) { if(x < 0) return 0; T y = 1; for(int i = 0; x; ++i) { if(x % 2) y *= _dp[i]; x >>= 1; } return y; } }; template <class T, class U, T m, T max> class fact_preproc { public: using value_type = mod_int<T, U, m>; static constexpr value_type max_value = max; private: mod_int<T, U, m> fact[max], inv[max], finv[max]; public: }; template <class T> #ifndef NO_CONCEPT requires std::integral<T> #endif // ! NO_CONCEPT constexpr T combination(T n, T r) { chmin(r, n - r); if(r < 0 || n < 0) return 0; T x = 1, i = 0; while(i < r) x *= (n - i) / (++i); return x; } template <class T, class U, T m> constexpr mod_int<T, U, m> combination(mod_int<T, U, m> n, mod_int<T, U, m> r) { chmin(r, n - r); mod_int<T, U, m> a = 1, d = 1, i = 0; while(i < r) { a *= n - i; d *= ++i; } return a / d; } template <size_t s, class T = ull> struct bits { using value_type = T; static constexpr size_t unit_bytes = sizeof(value_type); static constexpr size_t unit_bits = unit_bytes * 8; static constexpr size_t length = s / unit_bits + (s % unit_bits != 0); static constexpr value_type bitmask(size_t id) {return value_type(1) << (id % unit_bits);} class reference { friend class bits; friend class iterator; value_type* const _ptr; const value_type _mask; constexpr reference(value_type* ptr, value_type mask) : _ptr(ptr), _mask(mask) {}; public: explicit constexpr operator bool() const noexcept {return bool(*_ptr & _mask);} constexpr bool operator!() const noexcept {return !bool(*this);} constexpr reference& operator=(bool b) & noexcept { if(b) set(); else reset(); return *this; } constexpr reference& operator=(const reference& b) & noexcept { return *this = bool(b); } constexpr void set() noexcept {*_ptr |= _mask;} constexpr void reset() noexcept {*_ptr &= ~_mask;} constexpr void flip() noexcept {*this = !(*this);} }; class const_reference { friend class bits; friend class iterator; const value_type* const _ptr; const value_type _mask; constexpr const_reference(const value_type* ptr, value_type mask) : _ptr(ptr), _mask(mask) {}; public: explicit constexpr operator bool() const noexcept {return bool(*_ptr & _mask);} constexpr bool operator!() const noexcept {return !bool(*this);} constexpr const_reference& operator=(const reference& b) & = delete; }; class iterator { friend class bits; friend class reference; value_type* _ptr; size_t _bit; constexpr iterator(value_type* ptr, size_t bit) : _ptr(ptr), _bit(bit) {}; public: constexpr iterator& operator++() { if(++_bit == unit_bits) { _bit = 0; ++_ptr; } return *this; } constexpr iterator operator++(int) {iterator i(*this); ++(*this); return i;} constexpr iterator& operator--() { if(!_bit) { _bit = unit_bits; --_ptr; } --_bit; return *this; } constexpr iterator operator--(int) {iterator i(*this); --(*this); return i;} constexpr reference operator*() const {return reference(_ptr, value_type(1) << _bit);} }; class const_iterator { friend class bits; friend class reference; const value_type* _ptr; size_t _bit; constexpr const_iterator(const value_type* ptr, size_t bit) : _ptr(ptr), _bit(bit) {}; public: constexpr const_iterator& operator++() { if(++_bit == unit_bits) { _bit = 0; ++_ptr; } return *this; } constexpr const_iterator operator++(int) {iterator i(*this); ++(*this); return i;} constexpr const_iterator& operator--() { if(!_bit) { _bit = unit_bits; --_ptr; } --_bit; return *this; } constexpr const_iterator operator--(int) {iterator i(*this); --(*this); return i;} constexpr const_reference operator*() const {return const_reference(_ptr, value_type(1) << _bit);} }; value_type data[length]; constexpr void set() noexcept {constexpr_fill(std::data(data), length, ~value_type());} constexpr void set(size_t id) noexcept {data[id / unit_bits] |= bitmask(id);} constexpr void reset() noexcept {constexpr_fill(std::data(data), length, value_type());} constexpr void reset(size_t id) noexcept {data[id / unit_bits] &= ~bitmask(id);} constexpr void set(size_t id, bool b) noexcept {if(b) set(id); else reset(id);} constexpr bool get(size_t id) const noexcept {return bool(data[id / unit_bits] & bitmask(id));} constexpr void flip() noexcept {REP(i, length) data[i] = ~data[i];} constexpr bool operator[](size_t id) const noexcept {return get(id);} constexpr reference operator[](size_t id) noexcept {return reference(data + id / unit_bits, bitmask(id));} constexpr size_t size() const noexcept {return s;} constexpr iterator begin() noexcept {return iterator(data, 0);} constexpr const_iterator begin() const noexcept {return const_iterator(data, 0);} constexpr iterator end() noexcept {return iterator(data + size() / unit_bits, size() % unit_bits);} constexpr const_iterator end() const noexcept {return const_iterator(data + size() / unit_bits, size() % unit_bits);} constexpr const_iterator cbegin() const noexcept {return const_iterator(data, 0);} constexpr const_iterator cend() const noexcept {return const_iterator(data + size() / unit_bits, size() % unit_bits);} }; } // namespace nlib using namespace nlib; template<class T = ll, class U = double> T root(T a, T x) { T y = std::floor(std::pow(U(x), 1./U(a))); T pow_v = pow_preproc<T>(y).get_pow(a); dprint(pow_v); if(pow_v == x) { return y; } else if(pow_v < x) { do { ++y; pow_v = pow_preproc<T>(y).get_pow(a); } while(pow_v < x); --y; return y; } else { do { --y; pow_v = pow_preproc<T>(y).get_pow(a); } while(pow_v > x); return y; } } int main() { ll n, i, j = 1, k; scan(n); ll count = n + 1; for(;j < 60; ++j) { dprint(j); i = root(j, n); ll ipow = pow_preproc<ll>(i).get_pow(j); k = n - ipow; chmin(count, i + j + k); } println(count); }