結果

問題 No.1879 How many matchings?
ユーザー risujiroh
提出日時 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言語の場合は開発者のデバッグのため、公開されます。

コンパイルメッセージ
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>
      |                  ^

ソースコード

diff #
プレゼンテーションモードにする

#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_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>;
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));
}
#define all(c) begin(c), end(c)
#include <atcoder/modint>
// https://github.com/ecnerwala/cp-book/blob/master/src/bm.hpp
template <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
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
0