結果
問題 | No.1887 K Consecutive Ks (Easy) |
ユーザー | risujiroh |
提出日時 | 2022-03-25 22:18:25 |
言語 | C++17 (gcc 12.3.0 + boost 1.83.0) |
結果 |
CE
(最新)
AC
(最初)
|
実行時間 | - |
コード長 | 13,117 bytes |
コンパイル時間 | 2,837 ms |
コンパイル使用メモリ | 299,356 KB |
最終ジャッジ日時 | 2024-11-15 02:13:49 |
合計ジャッジ時間 | 3,454 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge3 |
(要ログイン)
コンパイルエラー時のメッセージ・ソースコードは、提出者また管理者しか表示できないようにしております。(リジャッジ後のコンパイルエラーは公開されます)
ただし、clay言語の場合は開発者のデバッグのため、公開されます。
ただし、clay言語の場合は開発者のデバッグのため、公開されます。
コンパイルメッセージ
In file included from main.cpp:3: main.cpp:369:18: error: redefinition of default argument for 'char <anonymous>' 369 | template <char = 0> | ^ main.cpp:357:18: note: original definition appeared here 357 | template <char = 0> | ^
ソースコード
#if __INCLUDE_LEVEL__ == 0 #include __FILE__ namespace r7h { using fp = atcoder::modint998244353; void main(int) { int n, m; scan(n, m); vector f(n + 1, vector<fp>(m + 1)); vector<fp> s(n + 1); vector suff_f(m + 1, vector<fp>(n + 2)); vector<fp> suff_s(n + 2); s[n] = 1; suff_s[n] = 1; for (int i : rev(rep(n))) { for (int x : rep1(m)) { // for (int y : rep(1, x)) { // if (n < i + y) { break; } // f[i][x] += s[i + y] - f[i + y][x]; // } f[i][x] = (suff_s[i + 1] - suff_s[min(i + x, n + 1)]) - (suff_f[x][i + 1] - suff_f[x][min(i + x, n + 1)]); s[i] += f[i][x]; suff_f[x][i] = f[i][x] + suff_f[x][i + 1]; } suff_s[i] = s[i] + suff_s[i + 1]; } fp ans = power(fp(m), n) - s[0]; println(ans.val()); } } // namespace r7h #else #define MULTI_CASES 0 #define INTERACTIVE 0 #ifndef LOCAL #define LOCAL 0 #endif #if !LOCAL #define NDEBUG #endif #ifndef __GLIBCXX_TYPE_INT_N_0 #define __GLIBCXX_TYPE_INT_N_0 __int128 #endif #include <bits/stdc++.h> #include <unistd.h> #include <x86intrin.h> namespace r7h { using namespace std; void main(int); } // namespace r7h #if LOCAL #include <utility/dump.hpp> #else #define DUMP(...) void(0) #endif #define LIFT(FN) \ []<class... Ts_>(Ts_&&... xs_) -> decltype(auto) { return FN(static_cast<Ts_&&>(xs_)...); } #define LAMBDA(...) \ [&]<class T1_ = void*, class T2_ = void*>([[maybe_unused]] T1_&& _1 = nullptr, [[maybe_unused]] T2_&& _2 = nullptr) \ -> decltype(auto) { \ return __VA_ARGS__; \ } namespace r7h { template <class F> class fix : F { public: explicit fix(F f) : F(move(f)) {} template <class... Ts> decltype(auto) operator()(Ts&&... xs) const { return F::operator()(ref(*this), forward<Ts>(xs)...); } }; template <class T> decay_t<T> decay_copy(T&& x) { return forward<T>(x); } template <class T> auto ref_or_move(remove_reference_t<T>& x) { if constexpr (is_reference_v<T> && !is_placeholder_v<decay_t<T>>) { return ref(x); } else { return move(x); } } template <class T, class D = decay_t<T>> bool const is_lambda_expr = is_placeholder_v<D> || is_bind_expression_v<D>; #define UNARY_LAMBDA(OP) \ template <class T, enable_if_t<is_lambda_expr<T>>* = nullptr> \ auto operator OP(T&& x) { \ return bind([]<class T_>(T_&& x_) -> decltype(auto) { return OP forward<T_>(x_); }, ref_or_move<T>(x)); \ } #define BINARY_LAMBDA(OP) \ template <class T1, class T2, enable_if_t<is_lambda_expr<T1> || is_lambda_expr<T2>>* = nullptr> \ auto operator OP(T1&& x, T2&& y) { \ auto f = []<class T1_, class T2_>(T1_&& x_, T2_&& y_) -> decltype(auto) { \ return forward<T1_>(x_) OP forward<T2_>(y_); \ }; \ return bind(move(f), ref_or_move<T1>(x), ref_or_move<T2>(y)); \ } BINARY_LAMBDA(+=) BINARY_LAMBDA(-=) BINARY_LAMBDA(*=) BINARY_LAMBDA(/=) BINARY_LAMBDA(%=) BINARY_LAMBDA(&=) BINARY_LAMBDA(|=) BINARY_LAMBDA(^=) BINARY_LAMBDA(<<=) BINARY_LAMBDA(>>=) UNARY_LAMBDA(++) UNARY_LAMBDA(--) UNARY_LAMBDA(+) UNARY_LAMBDA(-) BINARY_LAMBDA(+) BINARY_LAMBDA(-) BINARY_LAMBDA(*) BINARY_LAMBDA(/) BINARY_LAMBDA(%) UNARY_LAMBDA(~) BINARY_LAMBDA(&) BINARY_LAMBDA(|) BINARY_LAMBDA(^) BINARY_LAMBDA(<<) BINARY_LAMBDA(>>) BINARY_LAMBDA(==) BINARY_LAMBDA(!=) BINARY_LAMBDA(<) BINARY_LAMBDA(>) BINARY_LAMBDA(<=) BINARY_LAMBDA(>=) UNARY_LAMBDA(!) BINARY_LAMBDA(&&) BINARY_LAMBDA(||) #undef UNARY_LAMBDA #undef BINARY_LAMBDA using namespace placeholders; using i8 = signed char; using u8 = unsigned char; using i16 = short; using u16 = unsigned short; using i32 = int; using u32 = unsigned; using i64 = long long; using u64 = unsigned long long; using i128 = __int128; using u128 = unsigned __int128; template <int> struct signed_int; template <int> struct unsigned_int; #define INT_TYPE(N) \ template <> struct signed_int<N> { using type = i##N; }; \ template <> struct unsigned_int<N> { using type = u##N; }; INT_TYPE(8) INT_TYPE(16) INT_TYPE(32) INT_TYPE(64) INT_TYPE(128) #undef INT_TYPE template <int N> using signed_int_t = typename signed_int<N>::type; template <int N> using unsigned_int_t = typename unsigned_int<N>::type; namespace scan_impl { #if INTERACTIVE || LOCAL bool scan(char& c) { return scanf(" %c", &c) != EOF; } bool scan(string& s) { char c; if (!scan(c)) { return false; } for (s = c;; s += c) { c = char(getchar()); if (c <= ' ') { ungetc(c, stdin); break; } } return true; } template <class T> enable_if_t<is_integral_v<T>, bool> scan(T& x) { char c; if (!scan(c)) { return false; } make_unsigned_t<decltype(+x)> u = (c == '-' ? getchar() : c) & 15; while (true) { if (int t = getchar(); '0' <= t && t <= '9') { (u *= 10) += t & 15; } else { ungetc(t, stdin); break; } } x = T(c == '-' ? -u : u); return true; } template <class T> enable_if_t<is_floating_point_v<T>, bool> scan(T& x) { return scanf(is_same_v<T, float> ? "%f" : is_same_v<T, double> ? "%lf" : "%Lf", &x) != EOF; } #else char buf[1 << 15]; char* ptr = buf; char* last = buf; bool scan(char& c) { for (;; ++ptr) { if (last - ptr < 64) { last = move(ptr, last, buf); ptr = buf; last += read(STDIN_FILENO, last, end(buf) - last - 1); *last = '\0'; } if (ptr == last) { return false; } if (' ' < *ptr) { c = *ptr++; return true; } } } bool scan(string& s) { char c; if (!scan(c)) { return false; } for (s = c; ' ' < *ptr; s += c) { scan(c); } return true; } template <class T> enable_if_t<is_integral_v<T>, bool> scan(T& x) { char c; if (!scan(c)) { return false; } make_unsigned_t<decltype(+x)> u = (c == '-' ? *ptr++ : c) & 15; while ('0' <= *ptr && *ptr <= '9') { (u *= 10) += *ptr++ & 15; } x = T(c == '-' ? -u : u); return true; } template <class T> enable_if_t<is_floating_point_v<T>, bool> scan(T& x) { char c; if (!scan(c)) { return false; } int n; sscanf(--ptr, is_same_v<T, float> ? "%f%n" : is_same_v<T, double> ? "%lf%n" : "%Lf%n", &x, &n); ptr += n; return true; } #endif template <class R> auto scan(R&& r) -> decltype(begin(r), end(r), true) { return all_of(begin(r), end(r), LIFT(scan)); } template <class... Ts> enable_if_t<sizeof...(Ts) != 1, bool> scan(Ts&&... xs) { return (... && scan(forward<Ts>(xs))); } } // namespace scan_impl using scan_impl::scan; namespace print_impl { #if INTERACTIVE || LOCAL template <char = 0> void print(char c) { if (c) { putchar(c); } if (c == '\n') { fflush(stdout); } } template <char = 0, class T> enable_if_t<is_integral_v<T>> print(T x) { char buf[64]; char* ptr = to_chars(buf, end(buf), +x).ptr; for_each(buf, ptr, LIFT(print)); } template <char = 0, class T> enable_if_t<is_floating_point_v<T>> print(T x) { printf(is_same_v<T, float> ? "%.6f" : is_same_v<T, double> ? "%.15f" : "%.18Lf", x); } #else char buf[1 << 15]; char* ptr = buf; __attribute__((destructor)) void flush() { if (write(STDOUT_FILENO, buf, ptr - buf) == -1) { abort(); } ptr = buf; } template <char = 0> void print(char c) { if (end(buf) - ptr < 64) { flush(); } if (c) { *ptr++ = c; } } template <char = 0, class T> enable_if_t<is_integral_v<T>> print(T x) { print('\0'); ptr = to_chars(ptr, end(buf), +x).ptr; } template <char = 0, class T> enable_if_t<is_floating_point_v<T>> print(T x) { print('\0'); ptr += snprintf(ptr, end(buf) - ptr, is_same_v<T, float> ? "%.6f" : is_same_v<T, double> ? "%.15f" : "%.18Lf", x); } #endif template <char = 0> void print(char const*); template <char Sep = ' ', class R> auto print(R&& r) -> void_t<decltype(begin(r), end(r))> { [[maybe_unused]] char c = '\0'; for (auto&& e : r) { if constexpr (!is_same_v<decay_t<decltype(e)>, char>) { print(exchange(c, Sep)); } print(e); } } template <char = 0> void print(char const* s) { print(string_view(s)); } template <char Sep = ' ', class... Ts> enable_if_t<sizeof...(Ts) != 1> print(Ts&&... xs) { [[maybe_unused]] char c = '\0'; (..., (print(exchange(c, Sep)), print(forward<Ts>(xs)))); } } // namespace print_impl using print_impl::print; template <char Sep = ' ', char End = '\n', class... Ts> void println(Ts&&... xs) { print<Sep>(forward<Ts>(xs)...); print(End); } template <class T> auto operator++(T& x, int) -> decltype(++x, T(x)) { T ret = x; ++x; return ret; } template <class T> auto operator--(T& x, int) -> decltype(--x, T(x)) { T ret = x; --x; return ret; } #define BINARY_ARITH_OP(OP) \ template <class T1, class T2, class T = common_type_t<T1, T2>> \ auto operator OP(T1 const& x, T2 const& y) -> decltype(declval<T&>() OP##= y, T(x)) { \ T ret = T(x); \ ret OP##= y; \ return ret; \ } BINARY_ARITH_OP(+) BINARY_ARITH_OP(-) BINARY_ARITH_OP(*) BINARY_ARITH_OP(/) BINARY_ARITH_OP(%) BINARY_ARITH_OP(&) BINARY_ARITH_OP(|) BINARY_ARITH_OP(^) BINARY_ARITH_OP(<<) BINARY_ARITH_OP(>>) #undef BINARY_ARITH_OP #define COMPARISON_OP(OP, E) \ template <class T1, class T2> \ auto operator OP(T1 const& x, T2 const& y) -> decltype(E) { \ return E; \ } COMPARISON_OP(!=, !(x == y)) COMPARISON_OP(>, y < x) COMPARISON_OP(<=, !(y < x)) COMPARISON_OP(>=, !(x < y)) #undef COMPARISON_OP template <class D, class C, class R> class iter_base { D& derived() { return static_cast<D&>(*this); } D const& derived() const { return static_cast<D const&>(*this); } public: using iterator_category = C; using value_type = decay_t<R>; using difference_type = int; using pointer = void; using reference = R; #define REQUIRE(CAT) template <class C_ = C, enable_if_t<is_convertible_v<C_, CAT##_iterator_tag>>* = nullptr> R operator*() const { return derived().deref(); } REQUIRE(random_access) R operator[](int n) const { return *(derived() + n); } D& operator++() & { derived().inc(); return derived(); } REQUIRE(bidirectional) D& operator--() & { derived().dec(); return derived(); } REQUIRE(random_access) D& operator+=(int n) & { derived().adv(n); return derived(); } REQUIRE(random_access) D& operator-=(int n) & { derived().adv(-n); return derived(); } REQUIRE(random_access) friend D operator+(D const& x, int n) { D ret = x; ret += n; return ret; } REQUIRE(random_access) friend D operator+(int n, D const& x) { return x + n; } REQUIRE(random_access) friend D operator-(D const& x, int n) { D ret = x; ret -= n; return ret; } REQUIRE(random_access) friend int operator-(D const& x, D const& y) { return y.dist_to(x); } friend bool operator==(D const& x, D const& y) { return x.eq(y); } REQUIRE(random_access) friend bool operator<(D const& x, D const& y) { return x - y < 0; } #undef REQUIRE }; struct int_iter : iter_base<int_iter, random_access_iterator_tag, int> { int v; int_iter() = default; int_iter(int v) : v(v) {} int deref() const { return v; } bool eq(int_iter const& x) const { return v == x.v; } void inc() { ++v; } void dec() { --v; } void adv(int n) { v += n; } int dist_to(int_iter const& x) const { return x.v - v; } }; template <class I> class range { I b, e; public: explicit range(I first, I last) : b(move(first)), e(move(last)) {} I begin() const { return b; } I end() const { return e; } }; auto rep(int l, int r) { return range<int_iter>(min(l, r), r); } auto rep(int n) { return rep(0, n); } auto rep1(int l, int r) { return rep(l, r + 1); } auto rep1(int n) { return rep(1, n + 1); } template <class R> auto rev(R&& r) { return range(make_reverse_iterator(end(r)), make_reverse_iterator(begin(r))); } template <class R> auto sz(R&& r) -> decltype(int(size(forward<R>(r)))) { return int(size(forward<R>(r))); } template <class T, class N, class Op> T power1(T x, N n, Op op) { assert(1 <= n); for (; ~n & 1; n >>= 1) { x = op(x, x); } T ret = x; while (n >>= 1) { x = op(x, x); if (n & 1) { ret = op(move(ret), x); } } return ret; } template <class T, class N> T power(T x, N n) { if (n == 0) { return T{1}; } if (n < 0) { return T{1} / power1(move(x), -n, multiplies{}); } return power1(move(x), n, multiplies{}); } template <class T> T div_floor(T x, T y) { return T(x / y - ((x ^ y) < 0 && x % y)); } template <class T> T div_ceil(T x, T y) { return T(x / y + (0 <= (x ^ y) && x % y)); } template <class T, class U = T> bool chmin(T& x, U&& y) { return y < x ? x = forward<U>(y), true : false; } template <class T, class U = T> bool chmax(T& x, U&& y) { return x < y ? x = forward<U>(y), true : false; } template <class T> T const inf_v = numeric_limits<T>::max() / 2; int const inf = inf_v<int>; i64 const inf64 = inf_v<i64>; mt19937_64 mt(_rdtsc()); template <class T> T rand(T a, T b) { if constexpr (is_integral_v<T>) { return uniform_int_distribution(a, b)(mt); } else { return uniform_real_distribution(a, b)(mt); } } } // namespace r7h int main() { int t = 1; if (MULTI_CASES) { r7h::scan(t); } for (int i : r7h::rep(t)) { r7h::main(i); } assert(!r7h::scan(t)); } #include <atcoder/modint> #define all(c) begin(c), end(c) #endif