結果
問題 | No.1879 How many matchings? |
ユーザー |
![]() |
提出日時 | 2022-03-18 22:32:15 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
CE
(最新)
AC
(最初)
|
実行時間 | - |
コード長 | 14,138 bytes |
コンパイル時間 | 2,586 ms |
コンパイル使用メモリ | 301,924 KB |
最終ジャッジ日時 | 2025-01-28 10:30:17 |
ジャッジサーバーID (参考情報) |
judge5 / judge3 |
(要ログイン)
コンパイルエラー時のメッセージ・ソースコードは、提出者また管理者しか表示できないようにしております。(リジャッジ後のコンパイルエラーは公開されます)
ただし、clay言語の場合は開発者のデバッグのため、公開されます。
ただし、clay言語の場合は開発者のデバッグのため、公開されます。
コンパイルメッセージ
In file included from main.cpp:3: main.cpp:360:18: error: redefinition of default argument for ‘char <anonymous>’ 360 | template <char = 0> | ^ main.cpp:348:18: note: original definition appeared here 348 | template <char = 0> | ^
ソースコード
#if __INCLUDE_LEVEL__ == 0#include __FILE__namespace r7h {using fp = atcoder::modint1000000007;void main(int) {i64 n;scan(n);vector<fp> f(101);f[0] = 1;for (int i : rep1(100)) {if (2 <= i) { f[i] += f[i - 2]; }if (4 <= i) { f[i] += f[i - 4]; }if (i & 1) {f[i] += f[i - 1];if (3 <= i) { f[i] += f[i - 3]; }}}println(linearRec(f, BerlekampMassey(f), n).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_LAMBDAusing 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_TYPEtemplate <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 || LOCALbool 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;}#elsechar 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;}#endiftemplate <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_implusing scan_impl::scan;namespace print_impl {#if INTERACTIVE || LOCALtemplate <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);}#elsechar 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);}#endiftemplate <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_implusing 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_OPtemplate <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>;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 r7hint main() {int t = 1;if (MULTI_CASES) { r7h::scan(t); }for (int i : r7h::rep(t)) { r7h::main(i); }assert(!r7h::scan(t));}#define all(c) begin(c), end(c)#include <atcoder/modint>// https://github.com/ecnerwala/cp-book/blob/master/src/bm.hpptemplate <typename num>std::vector<num> BerlekampMassey(const std::vector<num>& s) {int n = int(s.size()), L = 0, m = 0;std::vector<num> C(n), B(n), T;C[0] = B[0] = 1;num b = 1;for (int i = 0; i < n; i++) {++m;num d = s[i];for (int j = 1; j <= L; j++) d += C[j] * s[i - j];if (d == 0) continue;T = C;num coef = d / b;for (int j = m; j < n; j++) C[j] -= coef * B[j - m];if (2 * L > i) continue;L = i + 1 - L;B = T;b = d;m = 0;}C.resize(L + 1);C.erase(C.begin());for (auto& x : C) { x = -x; }return C;}template <typename num>num linearRec(const std::vector<num>& S, const std::vector<num>& tr, long long k) {int n = int(tr.size());assert(S.size() >= tr.size());auto combine = [&](std::vector<num> a, std::vector<num> b) {std::vector<num> res(n * 2 + 1);for (int i = 0; i <= n; i++)for (int j = 0; j <= n; j++) res[i + j] += a[i] * b[j];for (int i = 2 * n; i > n; --i)for (int j = 0; j < n; j++) res[i - 1 - j] += res[i] * tr[j];res.resize(n + 1);return res;};std::vector<num> pol(n + 1), e(pol);pol[0] = e[1] = 1;for (++k; k; k /= 2) {if (k % 2) pol = combine(pol, e);e = combine(e, e);}num res = 0;for (int i = 0; i < n; i++) res += pol[i + 1] * S[i];return res;}#endif