QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#273510#7875. Queue Sortingucup-team180#AC ✓287ms4176kbC++2339.7kb2023-12-03 00:35:372023-12-03 00:35:37

Judging History

你现在查看的是最新测评结果

  • [2023-12-03 00:35:37]
  • 评测
  • 测评结果:AC
  • 用时:287ms
  • 内存:4176kb
  • [2023-12-03 00:35:37]
  • 提交

answer

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
using ull = unsigned long long;
typedef pair<ll,ll> pll;
typedef vector<ll> vll;
typedef vector<pll> vpll;
template<class T> using pqmin = priority_queue<T, vector<T>, greater<T>>;
template<class T> using pqmax = priority_queue<T>;
const ll inf=LLONG_MAX/3;
const ll dx[] = {0, 1, 0, -1, 1, -1, 1, -1};
const ll dy[] = {1, 0, -1, 0, 1, 1, -1, -1};
#define mp make_pair
#define pb push_back
#define eb emplace_back
#define fi first
#define se second
#define all(x) x.begin(),x.end()
#define si(x) ll(x.size())
#define rep(i,n) for(ll i=0;i<n;i++)
#define per(i,n) for(ll i=n-1;i>=0;i--)
#define rng(i,l,r) for(ll i=l;i<r;i++)
#define gnr(i,l,r) for(ll i=r-1;i>=l;i--)
#define fore(i, a) for(auto &&i : a)
#define fore2(a, b, v) for(auto &&[a, b] : v)
#define fore3(a, b, c, v) for(auto &&[a, b, c] : v)
template<class T> bool chmin(T& a, const T& b){ if(a <= b) return 0; a = b; return 1; }
template<class T> bool chmax(T& a, const T& b){ if(a >= b) return 0; a = b; return 1; }
template<class T, class U> bool chmin(T& a, const U& b){ return chmin(a, (T)b); }
template<class T, class U> bool chmax(T& a, const U& b){ return chmax(a, (T)b); }
#define LL(...) ll __VA_ARGS__;in(__VA_ARGS__)
#define STR(...) string __VA_ARGS__;in(__VA_ARGS__)
#define CHR(...) char __VA_ARGS__;in(__VA_ARGS__)
#define vec(type,name,...) vector<type>name(__VA_ARGS__)
#define VEC(type,name,size) vector<type>name(size);in(name)
#define VLL(name,size) vector<ll>name(size);in(name)
#define vv(type,name,h,...) vector<vector<type>> name(h,vector<type>(__VA_ARGS__))
#define VV(type,name,h,w) vector<vector<type>> name(h,vector<type>(w));in(name)
#define vvv(type,name,h,w,...) vector<vector<vector<type>>> name(h,vector<vector<type>>(w,vector<type>(__VA_ARGS__)))
#define SUM(...) accumulate(all(__VA_ARGS__),0LL)
template<class T> auto min(const T& a){ return *min_element(all(a)); }
template<class T> auto max(const T& a){ return *max_element(all(a)); }
template<class T, class F = less<>> void sor(T& a, F b = F{}){ sort(all(a), b); }
template<class T> void uniq(T& a){ sor(a); a.erase(unique(all(a)), end(a)); }
void outb(bool x){cout<<(x?"Yes":"No")<<"\n";}
ll max(int x, ll y) { return max((ll)x, y); }
ll max(ll x, int y) { return max(x, (ll)y); }
int min(int x, ll y) { return min((ll)x, y); }
int min(ll x, int y) { return min(x, (ll)y); }
#define lb(c, x) distance((c).begin(), lower_bound(all(c), (x)))
#define lbg(c, x) distance((c).begin(), lower_bound(all(c), (x), greater{}))
#define ub(c, x) distance((c).begin(), upper_bound(all(c), (x)))
#define ubg(c, x) distance((c).begin(), upper_bound(all(c), (x), greater{}))
ll gcd(ll a,ll b){return (b?gcd(b,a%b):a);}
vector<pll> factor(ull x){ vector<pll> ans; for(ull i = 2; i * i <= x; i++) if(x % i == 0){ ans.push_back({i, 1}); while((x /= i) % i == 0) ans.back().second++; } if(x != 1) ans.push_back({x, 1}); return ans; }
vector<ll> divisor(ull x){ vector<ll> ans; for(ull i = 1; i * i <= x; i++) if(x % i == 0) ans.push_back(i); per(i,ans.size() - (ans.back() * ans.back() == x)) ans.push_back(x / ans[i]); return ans; }
vll prime_table(ll n){vec(ll,isp,n+1,1);vll res;rng(i,2,n+1)if(isp[i]){res.pb(i);for(ll j=i*i;j<=n;j+=i)isp[j]=0;}return res;}

template <class T, class S> pair<T, S> operator-(const pair<T, S> &x) { return pair<T, S>(-x.first, -x.second); }
template <class T, class S> pair<T, S> operator-(const pair<T, S> &x, const pair<T, S> &y) { return pair<T, S>(x.fi - y.fi, x.se - y.se); }
template <class T, class S> pair<T, S> operator+(const pair<T, S> &x, const pair<T, S> &y) { return pair<T, S>(x.fi + y.fi, x.se + y.se); }
template <class T> pair<T, T> operator&(const pair<T, T> &l, const pair<T, T> &r) { return pair<T, T>(max(l.fi, r.fi), min(l.se, r.se)); }
template <class T, class S> pair<T, S> operator+=(pair<T, S> &l, const pair<T, S> &r) { return l = l + r; }
template <class T, class S> pair<T, S> operator-=(pair<T, S> &l, const pair<T, S> &r) { return l = l - r; }
template <class T> bool intersect(const pair<T, T> &l, const pair<T, T> &r) { return (l.se < r.se ? r.fi < l.se : l.fi < r.se); }

template <class T> vector<T> &operator++(vector<T> &v) {
                fore(e, v) e++;
                return v;
}
template <class T> vector<T> operator++(vector<T> &v, int) {
                auto res = v;
                fore(e, v) e++;
                return res;
}
template <class T> vector<T> &operator--(vector<T> &v) {
                fore(e, v) e--;
                return v;
}
template <class T> vector<T> operator--(vector<T> &v, int) {
                auto res = v;
                fore(e, v) e--;
                return res;
}
template <class T> vector<T> &operator+=(vector<T> &l, const vector<T> &r) {
                fore(e, r) l.eb(e);
                return l;
}

template<class... Ts> void in(Ts&... t);
[[maybe_unused]] void print(){}
template<class T, class... Ts> void print(const T& t, const Ts&... ts);
template<class... Ts> void out(const Ts&... ts){ print(ts...); cout << '\n'; }
namespace IO{
#define VOID(a) decltype(void(a))
struct S{ S(){ cin.tie(nullptr)->sync_with_stdio(0); fixed(cout).precision(12); } }S;
template<int I> struct P : P<I-1>{};
template<> struct P<0>{};
template<class T> void i(T& t){ i(t, P<3>{}); }
void i(vector<bool>::reference t, P<3>){ int a; i(a); t = a; }
template<class T> auto i(T& t, P<2>) -> VOID(cin >> t){ cin >> t; }
template<class T> auto i(T& t, P<1>) -> VOID(begin(t)){ for(auto&& x : t) i(x); }
template<class T, size_t... idx> void ituple(T& t, index_sequence<idx...>){ in(get<idx>(t)...); }
template<class T> auto i(T& t, P<0>) -> VOID(tuple_size<T>{}){ ituple(t, make_index_sequence<tuple_size<T>::value>{}); }
template<class T> void o(const T& t){ o(t, P<4>{}); }
template<size_t N> void o(const char (&t)[N], P<4>){ cout << t; }
template<class T, size_t N> void o(const T (&t)[N], P<3>){ o(t[0]); for(size_t i = 1; i < N; i++){ o(' '); o(t[i]); } }
template<class T> auto o(const T& t, P<2>) -> VOID(cout << t){ cout << t; }
template<class T> auto o(const T& t, P<1>) -> VOID(begin(t)){ bool first = 1; for(auto&& x : t) { if(first) first = 0; else o(' '); o(x); } }
template<class T, size_t... idx> void otuple(const T& t, index_sequence<idx...>){ print(get<idx>(t)...); }
template<class T> auto o(T& t, P<0>) -> VOID(tuple_size<T>{}){ otuple(t, make_index_sequence<tuple_size<T>::value>{}); }
#undef VOID
}
#define unpack(a) (void)initializer_list<int>{(a, 0)...}
template<class... Ts> void in(Ts&... t){ unpack(IO::i(t)); }
template<class T, class... Ts> void print(const T& t, const Ts&... ts){ IO::o(t); unpack(IO::o((cout << ' ', ts))); }
#undef unpack
#ifdef _MSC_VER
#include <intrin.h>
#endif
 
namespace atcoder {
 
namespace internal {
 
int ceil_pow2(int n) {
        int x = 0;
        while ((1U << x) < (unsigned int)(n)) x++;
        return x;
}
 
constexpr int bsf_constexpr(unsigned int n) {
        int x = 0;
        while (!(n & (1 << x))) x++;
        return x;
}
 
int bsf(unsigned int n) {
#ifdef _MSC_VER
        unsigned long index;
        _BitScanForward(&index, n);
        return index;
#else
        return __builtin_ctz(n);
#endif
}
 
}  // namespace internal
 
}  // namespace atcoder
 
 
#include <cassert>
#include <numeric>
#include <type_traits>
 
#ifdef _MSC_VER
#include <intrin.h>
#endif
 
 
#include <utility>
 
#ifdef _MSC_VER
#include <intrin.h>
#endif
 
namespace atcoder {
 
namespace internal {
 
constexpr long long safe_mod(long long x, long long m) {
        x %= m;
        if (x < 0) x += m;
        return x;
}
 
struct barrett {
        unsigned int _m;
        unsigned long long im;
 
        explicit barrett(unsigned int m) : _m(m), im((unsigned long long)(-1) / m + 1) {}
 
        unsigned int umod() const { return _m; }
 
        unsigned int mul(unsigned int a, unsigned int b) const {
 
                unsigned long long z = a;
                z *= b;
#ifdef _MSC_VER
                unsigned long long x;
                _umul128(z, im, &x);
#else
                unsigned long long x =
                        (unsigned long long)(((unsigned __int128)(z)*im) >> 64);
#endif
                unsigned int v = (unsigned int)(z - x * _m);
                if (_m <= v) v += _m;
                return v;
        }
};
 
constexpr long long pow_mod_constexpr(long long x, long long n, int m) {
        if (m == 1) return 0;
        unsigned int _m = (unsigned int)(m);
        unsigned long long r = 1;
        unsigned long long y = safe_mod(x, m);
        while (n) {
                if (n & 1) r = (r * y) % _m;
                y = (y * y) % _m;
                n >>= 1;
        }
        return r;
}
 
constexpr bool is_prime_constexpr(int n) {
        if (n <= 1) return false;
        if (n == 2 || n == 7 || n == 61) return true;
        if (n % 2 == 0) return false;
        long long d = n - 1;
        while (d % 2 == 0) d /= 2;
        constexpr long long bases[3] = {2, 7, 61};
        for (long long a : bases) {
                long long t = d;
                long long y = pow_mod_constexpr(a, t, n);
                while (t != n - 1 && y != 1 && y != n - 1) {
                        y = y * y % n;
                        t <<= 1;
                }
                if (y != n - 1 && t % 2 == 0) {
                        return false;
                }
        }
        return true;
}
template <int n> constexpr bool is_prime = is_prime_constexpr(n);
 
constexpr std::pair<long long, long long> inv_gcd(long long a, long long b) {
        a = safe_mod(a, b);
        if (a == 0) return {b, 0};
 
        long long s = b, t = a;
        long long m0 = 0, m1 = 1;
 
        while (t) {
                long long u = s / t;
                s -= t * u;
                m0 -= m1 * u;  // |m1 * u| <= |m1| * s <= b
 
 
                auto tmp = s;
                s = t;
                t = tmp;
                tmp = m0;
                m0 = m1;
                m1 = tmp;
        }
        if (m0 < 0) m0 += b / s;
        return {s, m0};
}
 
constexpr int primitive_root_constexpr(int m) {
        if (m == 2) return 1;
        if (m == 167772161) return 3;
        if (m == 469762049) return 3;
        if (m == 754974721) return 11;
        if (m == 998244353) return 3;
        int divs[20] = {};
        divs[0] = 2;
        int cnt = 1;
        int x = (m - 1) / 2;
        while (x % 2 == 0) x /= 2;
        for (int i = 3; (long long)(i)*i <= x; i += 2) {
                if (x % i == 0) {
                        divs[cnt++] = i;
                        while (x % i == 0) {
                                x /= i;
                        }
                }
        }
        if (x > 1) {
                divs[cnt++] = x;
        }
        for (int g = 2;; g++) {
                bool ok = true;
                for (int i = 0; i < cnt; i++) {
                        if (pow_mod_constexpr(g, (m - 1) / divs[i], m) == 1) {
                                ok = false;
                                break;
                        }
                }
                if (ok) return g;
        }
}
template <int m> constexpr int primitive_root = primitive_root_constexpr(m);
 
unsigned long long floor_sum_unsigned(unsigned long long n,
                                                                          unsigned long long m,
                                                                          unsigned long long a,
                                                                          unsigned long long b) {
        unsigned long long ans = 0;
        while (true) {
                if (a >= m) {
                        ans += n * (n - 1) / 2 * (a / m);
                        a %= m;
                }
                if (b >= m) {
                        ans += n * (b / m);
                        b %= m;
                }
 
                unsigned long long y_max = a * n + b;
                if (y_max < m) break;
                n = (unsigned long long)(y_max / m);
                b = (unsigned long long)(y_max % m);
                std::swap(m, a);
        }
        return ans;
}
 
}  // namespace internal
 
}  // namespace atcoder
 
 
#include <cassert>
#include <numeric>
#include <type_traits>
 
namespace atcoder {
 
namespace internal {
 
#ifndef _MSC_VER
template <class T>
using is_signed_int128 =
        typename std::conditional<std::is_same<T, __int128_t>::value ||
                                                                  std::is_same<T, __int128>::value,
                                                          std::true_type,
                                                          std::false_type>::type;
 
template <class T>
using is_unsigned_int128 =
        typename std::conditional<std::is_same<T, __uint128_t>::value ||
                                                                  std::is_same<T, unsigned __int128>::value,
                                                          std::true_type,
                                                          std::false_type>::type;
 
template <class T>
using make_unsigned_int128 =
        typename std::conditional<std::is_same<T, __int128_t>::value,
                                                          __uint128_t,
                                                          unsigned __int128>;
 
template <class T>
using is_integral = typename std::conditional<std::is_integral<T>::value ||
                                                                                                  is_signed_int128<T>::value ||
                                                                                                  is_unsigned_int128<T>::value,
                                                                                          std::true_type,
                                                                                          std::false_type>::type;
 
template <class T>
using is_signed_int = typename std::conditional<(is_integral<T>::value &&
                                                                                                 std::is_signed<T>::value) ||
                                                                                                        is_signed_int128<T>::value,
                                                                                                std::true_type,
                                                                                                std::false_type>::type;
 
template <class T>
using is_unsigned_int =
        typename std::conditional<(is_integral<T>::value &&
                                                           std::is_unsigned<T>::value) ||
                                                                  is_unsigned_int128<T>::value,
                                                          std::true_type,
                                                          std::false_type>::type;
 
template <class T>
using to_unsigned = typename std::conditional<
        is_signed_int128<T>::value,
        make_unsigned_int128<T>,
        typename std::conditional<std::is_signed<T>::value,
                                                          std::make_unsigned<T>,
                                                          std::common_type<T>>::type>::type;
 
#else
 
template <class T> using is_integral = typename std::is_integral<T>;
 
template <class T>
using is_signed_int =
        typename std::conditional<is_integral<T>::value && std::is_signed<T>::value,
                                                          std::true_type,
                                                          std::false_type>::type;
 
template <class T>
using is_unsigned_int =
        typename std::conditional<is_integral<T>::value &&
                                                                  std::is_unsigned<T>::value,
                                                          std::true_type,
                                                          std::false_type>::type;
 
template <class T>
using to_unsigned = typename std::conditional<is_signed_int<T>::value,
                                                                                          std::make_unsigned<T>,
                                                                                          std::common_type<T>>::type;
 
#endif
 
template <class T>
using is_signed_int_t = std::enable_if_t<is_signed_int<T>::value>;
 
template <class T>
using is_unsigned_int_t = std::enable_if_t<is_unsigned_int<T>::value>;
 
template <class T> using to_unsigned_t = typename to_unsigned<T>::type;
 
}  // namespace internal
 
}  // namespace atcoder
 
 
namespace atcoder {
 
namespace internal {
 
struct modint_base {};
struct static_modint_base : modint_base {};
 
template <class T> using is_modint = std::is_base_of<modint_base, T>;
template <class T> using is_modint_t = std::enable_if_t<is_modint<T>::value>;
 
}  // namespace internal
 
template <int m, std::enable_if_t<(1 <= m)>* = nullptr>
struct static_modint : internal::static_modint_base {
        using mint = static_modint;
 
  public:
        static constexpr int mod() { return m; }
        static mint raw(int v) {
                mint x;
                x._v = v;
                return x;
        }
 
        static_modint() : _v(0) {}
        template <class T, internal::is_signed_int_t<T>* = nullptr>
        static_modint(T v) {
                long long x = (long long)(v % (long long)(umod()));
                if (x < 0) x += umod();
                _v = (unsigned int)(x);
        }
        template <class T, internal::is_unsigned_int_t<T>* = nullptr>
        static_modint(T v) {
                _v = (unsigned int)(v % umod());
        }
 
        unsigned int val() const { return _v; }
 
        mint& operator++() {
                _v++;
                if (_v == umod()) _v = 0;
                return *this;
        }
        mint& operator--() {
                if (_v == 0) _v = umod();
                _v--;
                return *this;
        }
        mint operator++(int) {
                mint result = *this;
                ++*this;
                return result;
        }
        mint operator--(int) {
                mint result = *this;
                --*this;
                return result;
        }
 
        mint& operator+=(const mint& rhs) {
                _v += rhs._v;
                if (_v >= umod()) _v -= umod();
                return *this;
        }
        mint& operator-=(const mint& rhs) {
                _v -= rhs._v;
                if (_v >= umod()) _v += umod();
                return *this;
        }
        mint& operator*=(const mint& rhs) {
                unsigned long long z = _v;
                z *= rhs._v;
                _v = (unsigned int)(z % umod());
                return *this;
        }
        mint& operator/=(const mint& rhs) { return *this = *this * rhs.inv(); }
 
        mint operator+() const { return *this; }
        mint operator-() const { return mint() - *this; }
 
        mint pow(long long n) const {
                assert(0 <= n);
                mint x = *this, r = 1;
                while (n) {
                        if (n & 1) r *= x;
                        x *= x;
                        n >>= 1;
                }
                return r;
        }
        mint inv() const {
                if (prime) {
                        assert(_v);
                        return pow(umod() - 2);
                } else {
                        auto eg = internal::inv_gcd(_v, m);
                        assert(eg.first == 1);
                        return eg.second;
                }
        }
 
        friend mint operator+(const mint& lhs, const mint& rhs) {
                return mint(lhs) += rhs;
        }
        friend mint operator-(const mint& lhs, const mint& rhs) {
                return mint(lhs) -= rhs;
        }
        friend mint operator*(const mint& lhs, const mint& rhs) {
                return mint(lhs) *= rhs;
        }
        friend mint operator/(const mint& lhs, const mint& rhs) {
                return mint(lhs) /= rhs;
        }
        friend bool operator==(const mint& lhs, const mint& rhs) {
                return lhs._v == rhs._v;
        }
        friend bool operator!=(const mint& lhs, const mint& rhs) {
                return lhs._v != rhs._v;
        }
 
  private:
        unsigned int _v;
        static constexpr unsigned int umod() { return m; }
        static constexpr bool prime = internal::is_prime<m>;
};
 
template <int id> struct dynamic_modint : internal::modint_base {
        using mint = dynamic_modint;
 
  public:
        static int mod() { return (int)(bt.umod()); }
        static void set_mod(int m) {
                assert(1 <= m);
                bt = internal::barrett(m);
        }
        static mint raw(int v) {
                mint x;
                x._v = v;
                return x;
        }
 
        dynamic_modint() : _v(0) {}
        template <class T, internal::is_signed_int_t<T>* = nullptr>
        dynamic_modint(T v) {
                long long x = (long long)(v % (long long)(mod()));
                if (x < 0) x += mod();
                _v = (unsigned int)(x);
        }
        template <class T, internal::is_unsigned_int_t<T>* = nullptr>
        dynamic_modint(T v) {
                _v = (unsigned int)(v % mod());
        }
 
        unsigned int val() const { return _v; }
 
        mint& operator++() {
                _v++;
                if (_v == umod()) _v = 0;
                return *this;
        }
        mint& operator--() {
                if (_v == 0) _v = umod();
                _v--;
                return *this;
        }
        mint operator++(int) {
                mint result = *this;
                ++*this;
                return result;
        }
        mint operator--(int) {
                mint result = *this;
                --*this;
                return result;
        }
 
        mint& operator+=(const mint& rhs) {
                _v += rhs._v;
                if (_v >= umod()) _v -= umod();
                return *this;
        }
        mint& operator-=(const mint& rhs) {
                _v += mod() - rhs._v;
                if (_v >= umod()) _v -= umod();
                return *this;
        }
        mint& operator*=(const mint& rhs) {
                _v = bt.mul(_v, rhs._v);
                return *this;
        }
        mint& operator/=(const mint& rhs) { return *this = *this * rhs.inv(); }
 
        mint operator+() const { return *this; }
        mint operator-() const { return mint() - *this; }
 
        mint pow(long long n) const {
                assert(0 <= n);
                mint x = *this, r = 1;
                while (n) {
                        if (n & 1) r *= x;
                        x *= x;
                        n >>= 1;
                }
                return r;
        }
        mint inv() const {
                auto eg = internal::inv_gcd(_v, mod());
                assert(eg.first == 1);
                return eg.second;
        }
 
        friend mint operator+(const mint& lhs, const mint& rhs) {
                return mint(lhs) += rhs;
        }
        friend mint operator-(const mint& lhs, const mint& rhs) {
                return mint(lhs) -= rhs;
        }
        friend mint operator*(const mint& lhs, const mint& rhs) {
                return mint(lhs) *= rhs;
        }
        friend mint operator/(const mint& lhs, const mint& rhs) {
                return mint(lhs) /= rhs;
        }
        friend bool operator==(const mint& lhs, const mint& rhs) {
                return lhs._v == rhs._v;
        }
        friend bool operator!=(const mint& lhs, const mint& rhs) {
                return lhs._v != rhs._v;
        }
 
  private:
        unsigned int _v;
        static internal::barrett bt;
        static unsigned int umod() { return bt.umod(); }
};
template <int id> internal::barrett dynamic_modint<id>::bt(998244353);
 
using modint998244353 = static_modint<998244353>;
using modint1000000007 = static_modint<1000000007>;
using modint = dynamic_modint<-1>;
 
namespace internal {
 
template <class T>
using is_static_modint = std::is_base_of<internal::static_modint_base, T>;
 
template <class T>
using is_static_modint_t = std::enable_if_t<is_static_modint<T>::value>;
 
template <class> struct is_dynamic_modint : public std::false_type {};
template <int id>
struct is_dynamic_modint<dynamic_modint<id>> : public std::true_type {};
 
template <class T>
using is_dynamic_modint_t = std::enable_if_t<is_dynamic_modint<T>::value>;
 
}  // namespace internal
 
}  // namespace atcoder
 
 
namespace atcoder {
 
namespace internal {
 
template <class mint,
                  int g = internal::primitive_root<mint::mod()>,
                  internal::is_static_modint_t<mint>* = nullptr>
struct fft_info {
        static constexpr int rank2 = bsf_constexpr(mint::mod() - 1);
        std::array<mint, rank2 + 1> root;   // root[i]^(2^i) == 1
        std::array<mint, rank2 + 1> iroot;  // root[i] * iroot[i] == 1
 
        std::array<mint, std::max(0, rank2 - 2 + 1)> rate2;
        std::array<mint, std::max(0, rank2 - 2 + 1)> irate2;
 
        std::array<mint, std::max(0, rank2 - 3 + 1)> rate3;
        std::array<mint, std::max(0, rank2 - 3 + 1)> irate3;
 
        fft_info() {
                root[rank2] = mint(g).pow((mint::mod() - 1) >> rank2);
                iroot[rank2] = root[rank2].inv();
                for (int i = rank2 - 1; i >= 0; i--) {
                        root[i] = root[i + 1] * root[i + 1];
                        iroot[i] = iroot[i + 1] * iroot[i + 1];
                }
 
                {
                        mint prod = 1, iprod = 1;
                        for (int i = 0; i <= rank2 - 2; i++) {
                                rate2[i] = root[i + 2] * prod;
                                irate2[i] = iroot[i + 2] * iprod;
                                prod *= iroot[i + 2];
                                iprod *= root[i + 2];
                        }
                }
                {
                        mint prod = 1, iprod = 1;
                        for (int i = 0; i <= rank2 - 3; i++) {
                                rate3[i] = root[i + 3] * prod;
                                irate3[i] = iroot[i + 3] * iprod;
                                prod *= iroot[i + 3];
                                iprod *= root[i + 3];
                        }
                }
        }
};
 
template <class mint, internal::is_static_modint_t<mint>* = nullptr>
void butterfly(std::vector<mint>& a) {
        int n = int(a.size());
        int h = internal::ceil_pow2(n);
 
        static const fft_info<mint> info;
 
        int len = 0;  // a[i, i+(n>>len), i+2*(n>>len), ..] is transformed
        while (len < h) {
                if (h - len == 1) {
                        int p = 1 << (h - len - 1);
                        mint rot = 1;
                        for (int s = 0; s < (1 << len); s++) {
                                int offset = s << (h - len);
                                for (int i = 0; i < p; i++) {
                                        auto l = a[i + offset];
                                        auto r = a[i + offset + p] * rot;
                                        a[i + offset] = l + r;
                                        a[i + offset + p] = l - r;
                                }
                                if (s + 1 != (1 << len))
                                        rot *= info.rate2[bsf(~(unsigned int)(s))];
                        }
                        len++;
                } else {
                        int p = 1 << (h - len - 2);
                        mint rot = 1, imag = info.root[2];
                        for (int s = 0; s < (1 << len); s++) {
                                mint rot2 = rot * rot;
                                mint rot3 = rot2 * rot;
                                int offset = s << (h - len);
                                for (int i = 0; i < p; i++) {
                                        auto mod2 = 1ULL * mint::mod() * mint::mod();
                                        auto a0 = 1ULL * a[i + offset].val();
                                        auto a1 = 1ULL * a[i + offset + p].val() * rot.val();
                                        auto a2 = 1ULL * a[i + offset + 2 * p].val() * rot2.val();
                                        auto a3 = 1ULL * a[i + offset + 3 * p].val() * rot3.val();
                                        auto a1na3imag =
                                                1ULL * mint(a1 + mod2 - a3).val() * imag.val();
                                        auto na2 = mod2 - a2;
                                        a[i + offset] = a0 + a2 + a1 + a3;
                                        a[i + offset + 1 * p] = a0 + a2 + (2 * mod2 - (a1 + a3));
                                        a[i + offset + 2 * p] = a0 + na2 + a1na3imag;
                                        a[i + offset + 3 * p] = a0 + na2 + (mod2 - a1na3imag);
                                }
                                if (s + 1 != (1 << len))
                                        rot *= info.rate3[bsf(~(unsigned int)(s))];
                        }
                        len += 2;
                }
        }
}
 
template <class mint, internal::is_static_modint_t<mint>* = nullptr>
void butterfly_inv(std::vector<mint>& a) {
        int n = int(a.size());
        int h = internal::ceil_pow2(n);
 
        static const fft_info<mint> info;
 
        int len = h;  // a[i, i+(n>>len), i+2*(n>>len), ..] is transformed
        while (len) {
                if (len == 1) {
                        int p = 1 << (h - len);
                        mint irot = 1;
                        for (int s = 0; s < (1 << (len - 1)); s++) {
                                int offset = s << (h - len + 1);
                                for (int i = 0; i < p; i++) {
                                        auto l = a[i + offset];
                                        auto r = a[i + offset + p];
                                        a[i + offset] = l + r;
                                        a[i + offset + p] =
                                                (unsigned long long)(mint::mod() + l.val() - r.val()) *
                                                irot.val();
                                        ;
                                }
                                if (s + 1 != (1 << (len - 1)))
                                        irot *= info.irate2[bsf(~(unsigned int)(s))];
                        }
                        len--;
                } else {
                        int p = 1 << (h - len);
                        mint irot = 1, iimag = info.iroot[2];
                        for (int s = 0; s < (1 << (len - 2)); s++) {
                                mint irot2 = irot * irot;
                                mint irot3 = irot2 * irot;
                                int offset = s << (h - len + 2);
                                for (int i = 0; i < p; i++) {
                                        auto a0 = 1ULL * a[i + offset + 0 * p].val();
                                        auto a1 = 1ULL * a[i + offset + 1 * p].val();
                                        auto a2 = 1ULL * a[i + offset + 2 * p].val();
                                        auto a3 = 1ULL * a[i + offset + 3 * p].val();
 
                                        auto a2na3iimag =
                                                1ULL *
                                                mint((mint::mod() + a2 - a3) * iimag.val()).val();
 
                                        a[i + offset] = a0 + a1 + a2 + a3;
                                        a[i + offset + 1 * p] =
                                                (a0 + (mint::mod() - a1) + a2na3iimag) * irot.val();
                                        a[i + offset + 2 * p] =
                                                (a0 + a1 + (mint::mod() - a2) + (mint::mod() - a3)) *
                                                irot2.val();
                                        a[i + offset + 3 * p] =
                                                (a0 + (mint::mod() - a1) + (mint::mod() - a2na3iimag)) *
                                                irot3.val();
                                }
                                if (s + 1 != (1 << (len - 2)))
                                        irot *= info.irate3[bsf(~(unsigned int)(s))];
                        }
                        len -= 2;
                }
        }
}
 
template <class mint, internal::is_static_modint_t<mint>* = nullptr>
std::vector<mint> convolution_naive(const std::vector<mint>& a,
                                                                        const std::vector<mint>& b) {
        int n = int(a.size()), m = int(b.size());
        std::vector<mint> ans(n + m - 1);
        if (n < m) {
                for (int j = 0; j < m; j++) {
                        for (int i = 0; i < n; i++) {
                                ans[i + j] += a[i] * b[j];
                        }
                }
        } else {
                for (int i = 0; i < n; i++) {
                        for (int j = 0; j < m; j++) {
                                ans[i + j] += a[i] * b[j];
                        }
                }
        }
        return ans;
}
 
template <class mint, internal::is_static_modint_t<mint>* = nullptr>
std::vector<mint> convolution_fft(std::vector<mint> a, std::vector<mint> b) {
        int n = int(a.size()), m = int(b.size());
        int z = 1 << internal::ceil_pow2(n + m - 1);
        a.resize(z);
        internal::butterfly(a);
        b.resize(z);
        internal::butterfly(b);
        for (int i = 0; i < z; i++) {
                a[i] *= b[i];
        }
        internal::butterfly_inv(a);
        a.resize(n + m - 1);
        mint iz = mint(z).inv();
        for (int i = 0; i < n + m - 1; i++) a[i] *= iz;
        return a;
}
 
}  // namespace internal
 
template <class mint, internal::is_static_modint_t<mint>* = nullptr>
std::vector<mint> convolution(std::vector<mint>&& a, std::vector<mint>&& b) {
        int n = int(a.size()), m = int(b.size());
        if (!n || !m) return {};
        if (std::min(n, m) <= 60) return convolution_naive(a, b);
        return internal::convolution_fft(a, b);
}
 
template <class mint, internal::is_static_modint_t<mint>* = nullptr>
std::vector<mint> convolution(const std::vector<mint>& a,
                                                          const std::vector<mint>& b) {
        int n = int(a.size()), m = int(b.size());
        if (!n || !m) return {};
        if (std::min(n, m) <= 60) return convolution_naive(a, b);
        return internal::convolution_fft(a, b);
}
 
template <unsigned int mod = 998244353,
                  class T,
                  std::enable_if_t<internal::is_integral<T>::value>* = nullptr>
std::vector<T> convolution(const std::vector<T>& a, const std::vector<T>& b) {
        int n = int(a.size()), m = int(b.size());
        if (!n || !m) return {};
 
        using mint = static_modint<mod>;
        std::vector<mint> a2(n), b2(m);
        for (int i = 0; i < n; i++) {
                a2[i] = mint(a[i]);
        }
        for (int i = 0; i < m; i++) {
                b2[i] = mint(b[i]);
        }
        auto c2 = convolution(move(a2), move(b2));
        std::vector<T> c(n + m - 1);
        for (int i = 0; i < n + m - 1; i++) {
                c[i] = c2[i].val();
        }
        return c;
}
 
std::vector<long long> convolution_ll(const std::vector<long long>& a,
                                                                          const std::vector<long long>& b) {
        int n = int(a.size()), m = int(b.size());
        if (!n || !m) return {};
 
        static constexpr unsigned long long MOD1 = 754974721;  // 2^24
        static constexpr unsigned long long MOD2 = 167772161;  // 2^25
        static constexpr unsigned long long MOD3 = 469762049;  // 2^26
        static constexpr unsigned long long M2M3 = MOD2 * MOD3;
        static constexpr unsigned long long M1M3 = MOD1 * MOD3;
        static constexpr unsigned long long M1M2 = MOD1 * MOD2;
        static constexpr unsigned long long M1M2M3 = MOD1 * MOD2 * MOD3;
 
        static constexpr unsigned long long i1 =
                internal::inv_gcd(MOD2 * MOD3, MOD1).second;
        static constexpr unsigned long long i2 =
                internal::inv_gcd(MOD1 * MOD3, MOD2).second;
        static constexpr unsigned long long i3 =
                internal::inv_gcd(MOD1 * MOD2, MOD3).second;
 
        auto c1 = convolution<MOD1>(a, b);
        auto c2 = convolution<MOD2>(a, b);
        auto c3 = convolution<MOD3>(a, b);
 
        std::vector<long long> c(n + m - 1);
        for (int i = 0; i < n + m - 1; i++) {
                unsigned long long x = 0;
                x += (c1[i] * i1) % MOD1 * M2M3;
                x += (c2[i] * i2) % MOD2 * M1M3;
                x += (c3[i] * i3) % MOD3 * M1M2;
                long long diff =
                        c1[i] - internal::safe_mod((long long)(x), (long long)(MOD1));
                if (diff < 0) diff += MOD1;
                static constexpr unsigned long long offset[5] = {
                        0, 0, M1M2M3, 2 * M1M2M3, 3 * M1M2M3};
                x -= offset[diff % 5];
                c[i] = x;
        }
 
        return c;
}
 
}  // namespace atcoder
 

using namespace atcoder;
using mint=modint998244353;
using vmint=vector<mint>;

// combination mod prime
// https://youtu.be/8uowVvQ_-Mo?t=6002
// https://youtu.be/Tgd_zLfRZOQ?t=9928
struct modinv {
  int n; vector<mint> d;
  modinv(): n(2), d({0,1}) {}
  mint operator()(int i) {
        while (n <= i) d.push_back(-d[mint::mod()%n]*(mint::mod()/n)), ++n;
        return d[i];
  }
  mint operator[](int i) const { return d[i];}
} invs;
struct modfact {
  int n; vector<mint> d;
  modfact(): n(2), d({1,1}) {}
  mint operator()(int i) {
        while (n <= i) d.push_back(d.back()*n), ++n;
        return d[i];
  }
  mint operator[](int i) const { return d[i];}
} facts;
struct modfactinv {
  int n; vector<mint> d;
  modfactinv(): n(2), d({1,1}) {}
  mint operator()(int i) {
        while (n <= i) d.push_back(d.back()*invs(n)), ++n;
        return d[i];
  }
  mint operator[](int i) const { return d[i];}
} ifacts;
mint comb(int n, int k) {
  if (n < k || k < 0) return 0;
  return facts(n)*ifacts(k)*ifacts(n-k);
}
mint choose(int n,int r){
        return comb(n+r-1,r);
}
int main(){
        cin.tie(0);
        ios::sync_with_stdio(0);
        ll n;
        cin>>n;
        vll a;
				rep(i,n){
					ll x;
					cin>>x;
					if(x>0){
						a.pb(x);
					}
				}
				n=si(a);
				ll m=510;
        vv(mint,dp,n,m,0);
        dp[0][a[0]]=1;
        rng(i,1,n){
                rng(x,1,m)if(dp[i-1][x]!=0){
												dp[i][x+a[i]]+=dp[i-1][x];
                        rng(k,1,x+1){
                                rng(p,1,a[i]+1){
                                        ll xx=x-k+1+(a[i]-p);
                                        mint res=choose(k,p-1)*dp[i-1][x];
                                        if(res!=0){
                                                dp[i][xx]+=res;
                                        }
                                }
                        }
                }
        }
        mint ans=0;
        rng(x,1,m)ans+=dp[n-1][x];
        out(ans.val());
}

这程序好像有点Bug,我给组数据试试?

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 0ms
memory: 3492kb

input:

4
1 1 1 1

output:

14

result:

ok 1 number(s): "14"

Test #2:

score: 0
Accepted
time: 283ms
memory: 4108kb

input:

300
0 5 2 2 1 0 3 2 2 5 2 1 1 2 1 3 2 3 2 0 0 0 0 1 2 2 3 0 2 2 3 2 0 2 3 0 6 0 0 2 0 1 3 2 1 1 1 3 4 0 1 0 4 1 1 1 1 1 1 2 3 2 1 2 3 2 3 0 5 3 3 2 0 1 1 0 2 1 1 2 0 0 2 1 1 3 2 2 1 2 1 3 0 3 0 1 2 2 0 5 0 2 2 0 0 0 1 2 1 4 2 1 1 0 3 0 2 0 3 1 1 2 0 2 1 1 0 2 0 1 2 2 3 3 1 1 1 1 0 1 3 3 1 0 2 2 4 2 ...

output:

507010274

result:

ok 1 number(s): "507010274"

Test #3:

score: 0
Accepted
time: 269ms
memory: 4176kb

input:

500
1 1 0 2 1 0 2 3 2 0 0 2 0 2 1 1 0 0 1 1 1 2 1 1 1 0 1 1 2 2 1 4 0 2 1 0 2 3 1 0 1 1 0 2 1 2 2 1 0 0 3 1 4 1 1 2 1 1 0 1 3 1 2 0 0 0 2 1 2 0 0 3 2 1 1 1 1 1 2 1 0 1 0 0 0 1 0 0 2 1 1 0 1 0 1 0 1 0 0 1 0 1 1 0 0 0 1 0 0 0 2 1 1 0 1 1 0 1 1 0 0 1 0 3 1 3 0 0 2 0 0 1 1 0 0 0 0 0 1 0 0 0 0 0 1 2 0 0 ...

output:

7590964

result:

ok 1 number(s): "7590964"

Test #4:

score: 0
Accepted
time: 287ms
memory: 3868kb

input:

200
3 1 0 3 2 1 0 3 1 1 2 3 3 1 6 2 1 3 2 1 1 2 1 2 1 5 2 2 3 4 0 4 2 1 2 2 0 2 3 1 2 3 6 3 2 3 2 2 4 2 7 2 1 5 1 9 0 4 4 8 3 3 3 1 3 0 2 2 8 1 3 5 4 3 0 6 1 6 1 3 4 2 2 1 1 4 4 4 1 0 4 3 4 3 3 0 3 2 0 0 3 4 0 3 1 3 2 4 3 2 0 3 2 2 3 2 2 2 1 2 2 1 0 2 0 3 1 3 5 1 3 3 6 5 3 2 2 2 3 6 2 0 5 2 2 2 2 1 ...

output:

507844569

result:

ok 1 number(s): "507844569"

Test #5:

score: 0
Accepted
time: 63ms
memory: 3696kb

input:

100
4 8 2 5 4 4 3 0 2 7 2 3 4 4 1 2 3 4 4 4 3 3 3 3 3 2 4 1 3 5 5 1 4 6 1 1 1 3 2 3 2 1 0 1 4 4 2 4 2 5 3 5 1 6 2 3 3 1 4 4 4 1 4 4 3 4 2 0 2 3 6 1 3 3 5 4 1 1 2 3 0 3 2 2 1 3 3 2 5 6 3 2 3 3 5 4 2 3 4 4

output:

989550242

result:

ok 1 number(s): "989550242"

Test #6:

score: 0
Accepted
time: 0ms
memory: 3592kb

input:

1
1

output:

1

result:

ok 1 number(s): "1"

Test #7:

score: 0
Accepted
time: 0ms
memory: 3496kb

input:

500
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ...

output:

1

result:

ok 1 number(s): "1"

Test #8:

score: 0
Accepted
time: 0ms
memory: 3508kb

input:

10
2 1 3 3 2 3 1 1 3 1

output:

165452340

result:

ok 1 number(s): "165452340"

Test #9:

score: 0
Accepted
time: 1ms
memory: 3568kb

input:

20
0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0

output:

2

result:

ok 1 number(s): "2"

Test #10:

score: 0
Accepted
time: 0ms
memory: 3568kb

input:

20
0 0 1 0 0 0 0 1 0 0 0 0 0 0 2 0 1 0 0 0

output:

28

result:

ok 1 number(s): "28"

Test #11:

score: 0
Accepted
time: 1ms
memory: 3504kb

input:

10
1 1 1 1 1 1 1 1 1 1

output:

16796

result:

ok 1 number(s): "16796"

Test #12:

score: 0
Accepted
time: 57ms
memory: 4148kb

input:

300
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 ...

output:

431279497

result:

ok 1 number(s): "431279497"

Test #13:

score: 0
Accepted
time: 2ms
memory: 3496kb

input:

2
232 268

output:

929717758

result:

ok 1 number(s): "929717758"

Test #14:

score: 0
Accepted
time: 1ms
memory: 3560kb

input:

1
500

output:

1

result:

ok 1 number(s): "1"

Test #15:

score: 0
Accepted
time: 145ms
memory: 3512kb

input:

3
155 180 165

output:

911108550

result:

ok 1 number(s): "911108550"

Extra Test:

score: 0
Extra Test Passed