QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#879460 | #9700. Ying’s Cup | ucup-team987# | WA | 174ms | 4352kb | C++23 | 42.6kb | 2025-02-02 03:03:26 | 2025-02-02 03:03:27 |
Judging History
answer
/**
* date : 2025-02-02 04:03:15
* author : Nyaan
*/
#define NDEBUG
using namespace std;
// intrinstic
#include <immintrin.h>
#include <algorithm>
#include <array>
#include <bitset>
#include <cassert>
#include <cctype>
#include <cfenv>
#include <cfloat>
#include <chrono>
#include <cinttypes>
#include <climits>
#include <cmath>
#include <complex>
#include <cstdarg>
#include <cstddef>
#include <cstdint>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <deque>
#include <fstream>
#include <functional>
#include <initializer_list>
#include <iomanip>
#include <ios>
#include <iostream>
#include <istream>
#include <iterator>
#include <limits>
#include <list>
#include <map>
#include <memory>
#include <new>
#include <numeric>
#include <ostream>
#include <queue>
#include <random>
#include <set>
#include <sstream>
#include <stack>
#include <streambuf>
#include <string>
#include <tr2/dynamic_bitset>
#include <tuple>
#include <type_traits>
#include <typeinfo>
#include <unordered_map>
#include <unordered_set>
#include <utility>
#include <vector>
// utility
namespace Nyaan {
using ll = long long;
using i64 = long long;
using u64 = unsigned long long;
using i128 = __int128_t;
using u128 = __uint128_t;
template <typename T>
using V = vector<T>;
template <typename T>
using VV = vector<vector<T>>;
using vi = vector<int>;
using vl = vector<long long>;
using vd = V<double>;
using vs = V<string>;
using vvi = vector<vector<int>>;
using vvl = vector<vector<long long>>;
template <typename T>
using minpq = priority_queue<T, vector<T>, greater<T>>;
template <typename T, typename U>
struct P : pair<T, U> {
template <typename... Args>
constexpr P(Args... args) : pair<T, U>(args...) {}
using pair<T, U>::first;
using pair<T, U>::second;
P &operator+=(const P &r) {
first += r.first;
second += r.second;
return *this;
}
P &operator-=(const P &r) {
first -= r.first;
second -= r.second;
return *this;
}
P &operator*=(const P &r) {
first *= r.first;
second *= r.second;
return *this;
}
template <typename S>
P &operator*=(const S &r) {
first *= r, second *= r;
return *this;
}
P operator+(const P &r) const { return P(*this) += r; }
P operator-(const P &r) const { return P(*this) -= r; }
P operator*(const P &r) const { return P(*this) *= r; }
template <typename S>
P operator*(const S &r) const {
return P(*this) *= r;
}
P operator-() const { return P{-first, -second}; }
};
using pl = P<ll, ll>;
using pi = P<int, int>;
using vp = V<pl>;
constexpr int inf = 1001001001;
constexpr long long infLL = 4004004004004004004LL;
template <typename T>
int sz(const T &t) {
return t.size();
}
template <typename T, typename U>
inline bool amin(T &x, U y) {
return (y < x) ? (x = y, true) : false;
}
template <typename T, typename U>
inline bool amax(T &x, U y) {
return (x < y) ? (x = y, true) : false;
}
template <typename T>
inline T Max(const vector<T> &v) {
return *max_element(begin(v), end(v));
}
template <typename T>
inline T Min(const vector<T> &v) {
return *min_element(begin(v), end(v));
}
template <typename T>
inline long long Sum(const vector<T> &v) {
return accumulate(begin(v), end(v), 0LL);
}
template <typename T>
int lb(const vector<T> &v, const T &a) {
return lower_bound(begin(v), end(v), a) - begin(v);
}
template <typename T>
int ub(const vector<T> &v, const T &a) {
return upper_bound(begin(v), end(v), a) - begin(v);
}
constexpr long long TEN(int n) {
long long ret = 1, x = 10;
for (; n; x *= x, n >>= 1) ret *= (n & 1 ? x : 1);
return ret;
}
template <typename T, typename U>
pair<T, U> mkp(const T &t, const U &u) {
return make_pair(t, u);
}
template <typename T>
vector<T> mkrui(const vector<T> &v, bool rev = false) {
vector<T> ret(v.size() + 1);
if (rev) {
for (int i = int(v.size()) - 1; i >= 0; i--) ret[i] = v[i] + ret[i + 1];
} else {
for (int i = 0; i < int(v.size()); i++) ret[i + 1] = ret[i] + v[i];
}
return ret;
};
template <typename T>
vector<T> mkuni(const vector<T> &v) {
vector<T> ret(v);
sort(ret.begin(), ret.end());
ret.erase(unique(ret.begin(), ret.end()), ret.end());
return ret;
}
template <typename F>
vector<int> mkord(int N, F f) {
vector<int> ord(N);
iota(begin(ord), end(ord), 0);
sort(begin(ord), end(ord), f);
return ord;
}
template <typename T>
vector<int> mkinv(vector<T> &v) {
int max_val = *max_element(begin(v), end(v));
vector<int> inv(max_val + 1, -1);
for (int i = 0; i < (int)v.size(); i++) inv[v[i]] = i;
return inv;
}
vector<int> mkiota(int n) {
vector<int> ret(n);
iota(begin(ret), end(ret), 0);
return ret;
}
template <typename T>
T mkrev(const T &v) {
T w{v};
reverse(begin(w), end(w));
return w;
}
template <typename T>
bool nxp(T &v) {
return next_permutation(begin(v), end(v));
}
// 返り値の型は入力の T に依存
// i 要素目 : [0, a[i])
template <typename T>
vector<vector<T>> product(const vector<T> &a) {
vector<vector<T>> ret;
vector<T> v;
auto dfs = [&](auto rc, int i) -> void {
if (i == (int)a.size()) {
ret.push_back(v);
return;
}
for (int j = 0; j < a[i]; j++) v.push_back(j), rc(rc, i + 1), v.pop_back();
};
dfs(dfs, 0);
return ret;
}
// F : function(void(T&)), mod を取る操作
// T : 整数型のときはオーバーフローに注意する
template <typename T>
T Power(T a, long long n, const T &I, const function<void(T &)> &f) {
T res = I;
for (; n; f(a = a * a), n >>= 1) {
if (n & 1) f(res = res * a);
}
return res;
}
// T : 整数型のときはオーバーフローに注意する
template <typename T>
T Power(T a, long long n, const T &I = T{1}) {
return Power(a, n, I, function<void(T &)>{[](T &) -> void {}});
}
template <typename T>
T Rev(const T &v) {
T res = v;
reverse(begin(res), end(res));
return res;
}
template <typename T>
vector<T> Transpose(const vector<T> &v) {
using U = typename T::value_type;
if(v.empty()) return {};
int H = v.size(), W = v[0].size();
vector res(W, T(H, U{}));
for (int i = 0; i < H; i++) {
for (int j = 0; j < W; j++) {
res[j][i] = v[i][j];
}
}
return res;
}
template <typename T>
vector<T> Rotate(const vector<T> &v, int clockwise = true) {
using U = typename T::value_type;
int H = v.size(), W = v[0].size();
vector res(W, T(H, U{}));
for (int i = 0; i < H; i++) {
for (int j = 0; j < W; j++) {
if (clockwise) {
res[W - 1 - j][i] = v[i][j];
} else {
res[j][H - 1 - i] = v[i][j];
}
}
}
return res;
}
} // namespace Nyaan
// bit operation
namespace Nyaan {
__attribute__((target("popcnt"))) inline int popcnt(const u64 &a) {
return __builtin_popcountll(a);
}
inline int lsb(const u64 &a) { return a ? __builtin_ctzll(a) : 64; }
inline int ctz(const u64 &a) { return a ? __builtin_ctzll(a) : 64; }
inline int msb(const u64 &a) { return a ? 63 - __builtin_clzll(a) : -1; }
template <typename T>
inline int gbit(const T &a, int i) {
return (a >> i) & 1;
}
template <typename T>
inline void sbit(T &a, int i, bool b) {
if (gbit(a, i) != b) a ^= T(1) << i;
}
constexpr long long PW(int n) { return 1LL << n; }
constexpr long long MSK(int n) { return (1LL << n) - 1; }
} // namespace Nyaan
// inout
namespace Nyaan {
template <typename T, typename U>
ostream &operator<<(ostream &os, const pair<T, U> &p) {
os << p.first << " " << p.second;
return os;
}
template <typename T, typename U>
istream &operator>>(istream &is, pair<T, U> &p) {
is >> p.first >> p.second;
return is;
}
template <typename T>
ostream &operator<<(ostream &os, const vector<T> &v) {
int s = (int)v.size();
for (int i = 0; i < s; i++) os << (i ? " " : "") << v[i];
return os;
}
template <typename T>
istream &operator>>(istream &is, vector<T> &v) {
for (auto &x : v) is >> x;
return is;
}
istream &operator>>(istream &is, __int128_t &x) {
string S;
is >> S;
x = 0;
int flag = 0;
for (auto &c : S) {
if (c == '-') {
flag = true;
continue;
}
x *= 10;
x += c - '0';
}
if (flag) x = -x;
return is;
}
istream &operator>>(istream &is, __uint128_t &x) {
string S;
is >> S;
x = 0;
for (auto &c : S) {
x *= 10;
x += c - '0';
}
return is;
}
ostream &operator<<(ostream &os, __int128_t x) {
if (x == 0) return os << 0;
if (x < 0) os << '-', x = -x;
string S;
while (x) S.push_back('0' + x % 10), x /= 10;
reverse(begin(S), end(S));
return os << S;
}
ostream &operator<<(ostream &os, __uint128_t x) {
if (x == 0) return os << 0;
string S;
while (x) S.push_back('0' + x % 10), x /= 10;
reverse(begin(S), end(S));
return os << S;
}
void in() {}
template <typename T, class... U>
void in(T &t, U &...u) {
cin >> t;
in(u...);
}
void out() { cout << "\n"; }
template <typename T, class... U, char sep = ' '>
void out(const T &t, const U &...u) {
cout << t;
if (sizeof...(u)) cout << sep;
out(u...);
}
struct IoSetupNya {
IoSetupNya() {
cin.tie(nullptr);
ios::sync_with_stdio(false);
cout << fixed << setprecision(15);
cerr << fixed << setprecision(7);
}
} iosetupnya;
} // namespace Nyaan
// debug
#ifdef NyaanDebug
#define trc(...) (void(0))
#else
#define trc(...) (void(0))
#endif
#ifdef NyaanLocal
#define trc2(...) (void(0))
#else
#define trc2(...) (void(0))
#endif
// macro
#define each(x, v) for (auto&& x : v)
#define each2(x, y, v) for (auto&& [x, y] : v)
#define all(v) (v).begin(), (v).end()
#define rep(i, N) for (long long i = 0; i < (long long)(N); i++)
#define repr(i, N) for (long long i = (long long)(N)-1; i >= 0; i--)
#define rep1(i, N) for (long long i = 1; i <= (long long)(N); i++)
#define repr1(i, N) for (long long i = (N); (long long)(i) > 0; i--)
#define reg(i, a, b) for (long long i = (a); i < (b); i++)
#define regr(i, a, b) for (long long i = (b)-1; i >= (a); i--)
#define fi first
#define se second
#define ini(...) \
int __VA_ARGS__; \
in(__VA_ARGS__)
#define inl(...) \
long long __VA_ARGS__; \
in(__VA_ARGS__)
#define ins(...) \
string __VA_ARGS__; \
in(__VA_ARGS__)
#define in2(s, t) \
for (int i = 0; i < (int)s.size(); i++) { \
in(s[i], t[i]); \
}
#define in3(s, t, u) \
for (int i = 0; i < (int)s.size(); i++) { \
in(s[i], t[i], u[i]); \
}
#define in4(s, t, u, v) \
for (int i = 0; i < (int)s.size(); i++) { \
in(s[i], t[i], u[i], v[i]); \
}
#define die(...) \
do { \
Nyaan::out(__VA_ARGS__); \
return; \
} while (0)
namespace Nyaan {
void solve();
}
int main() { Nyaan::solve(); }
//
using namespace std;
namespace internal {
unsigned long long non_deterministic_seed() {
unsigned long long m =
chrono::duration_cast<chrono::nanoseconds>(
chrono::high_resolution_clock::now().time_since_epoch())
.count();
m ^= 9845834732710364265uLL;
m ^= m << 24, m ^= m >> 31, m ^= m << 35;
return m;
}
unsigned long long deterministic_seed() { return 88172645463325252UL; }
// 64 bit の seed 値を生成 (手元では seed 固定)
// 連続で呼び出すと同じ値が何度も返ってくるので注意
// #define RANDOMIZED_SEED するとシードがランダムになる
unsigned long long seed() {
#if defined(DETERMINISTIC_SEED)
return deterministic_seed();
#elif defined(NyaanLocal) && !defined(RANDOMIZED_SEED)
return deterministic_seed();
#else
return non_deterministic_seed();
#endif
}
} // namespace internal
namespace my_rand {
using i64 = long long;
using u64 = unsigned long long;
// [0, 2^64 - 1)
u64 rng() {
static u64 _x = internal::seed();
return _x ^= _x << 7, _x ^= _x >> 9;
}
// [l, r]
i64 rng(i64 l, i64 r) {
assert(l <= r);
return l + rng() % u64(r - l + 1);
}
// [l, r)
i64 randint(i64 l, i64 r) {
assert(l < r);
return l + rng() % u64(r - l);
}
// choose n numbers from [l, r) without overlapping
vector<i64> randset(i64 l, i64 r, i64 n) {
assert(l <= r && n <= r - l);
unordered_set<i64> s;
for (i64 i = n; i; --i) {
i64 m = randint(l, r + 1 - i);
if (s.find(m) != s.end()) m = r - i;
s.insert(m);
}
vector<i64> ret;
for (auto& x : s) ret.push_back(x);
sort(begin(ret), end(ret));
return ret;
}
// [0.0, 1.0)
double rnd() { return rng() * 5.42101086242752217004e-20; }
// [l, r)
double rnd(double l, double r) {
assert(l < r);
return l + rnd() * (r - l);
}
template <typename T>
void randshf(vector<T>& v) {
int n = v.size();
for (int i = 1; i < n; i++) swap(v[i], v[randint(0, i + 1)]);
}
} // namespace my_rand
using my_rand::randint;
using my_rand::randset;
using my_rand::randshf;
using my_rand::rnd;
using my_rand::rng;
using namespace std;
struct Timer {
chrono::high_resolution_clock::time_point st;
Timer() { reset(); }
void reset() { st = chrono::high_resolution_clock::now(); }
long long elapsed() {
auto ed = chrono::high_resolution_clock::now();
return chrono::duration_cast<chrono::milliseconds>(ed - st).count();
}
long long operator()() { return elapsed(); }
};
//
template <typename mint>
struct FormalPowerSeries : vector<mint> {
using vector<mint>::vector;
using FPS = FormalPowerSeries;
FPS &operator+=(const FPS &r) {
if (r.size() > this->size()) this->resize(r.size());
for (int i = 0; i < (int)r.size(); i++) (*this)[i] += r[i];
return *this;
}
FPS &operator+=(const mint &r) {
if (this->empty()) this->resize(1);
(*this)[0] += r;
return *this;
}
FPS &operator-=(const FPS &r) {
if (r.size() > this->size()) this->resize(r.size());
for (int i = 0; i < (int)r.size(); i++) (*this)[i] -= r[i];
return *this;
}
FPS &operator-=(const mint &r) {
if (this->empty()) this->resize(1);
(*this)[0] -= r;
return *this;
}
FPS &operator*=(const mint &v) {
for (int k = 0; k < (int)this->size(); k++) (*this)[k] *= v;
return *this;
}
FPS &operator/=(const FPS &r) {
if (this->size() < r.size()) {
this->clear();
return *this;
}
int n = this->size() - r.size() + 1;
if ((int)r.size() <= 64) {
FPS f(*this), g(r);
g.shrink();
mint coeff = g.back().inverse();
for (auto &x : g) x *= coeff;
int deg = (int)f.size() - (int)g.size() + 1;
int gs = g.size();
FPS quo(deg);
for (int i = deg - 1; i >= 0; i--) {
quo[i] = f[i + gs - 1];
for (int j = 0; j < gs; j++) f[i + j] -= quo[i] * g[j];
}
*this = quo * coeff;
this->resize(n, mint(0));
return *this;
}
return *this = ((*this).rev().pre(n) * r.rev().inv(n)).pre(n).rev();
}
FPS &operator%=(const FPS &r) {
*this -= *this / r * r;
shrink();
return *this;
}
FPS operator+(const FPS &r) const { return FPS(*this) += r; }
FPS operator+(const mint &v) const { return FPS(*this) += v; }
FPS operator-(const FPS &r) const { return FPS(*this) -= r; }
FPS operator-(const mint &v) const { return FPS(*this) -= v; }
FPS operator*(const FPS &r) const { return FPS(*this) *= r; }
FPS operator*(const mint &v) const { return FPS(*this) *= v; }
FPS operator/(const FPS &r) const { return FPS(*this) /= r; }
FPS operator%(const FPS &r) const { return FPS(*this) %= r; }
FPS operator-() const {
FPS ret(this->size());
for (int i = 0; i < (int)this->size(); i++) ret[i] = -(*this)[i];
return ret;
}
void shrink() {
while (this->size() && this->back() == mint(0)) this->pop_back();
}
FPS rev() const {
FPS ret(*this);
reverse(begin(ret), end(ret));
return ret;
}
FPS dot(FPS r) const {
FPS ret(min(this->size(), r.size()));
for (int i = 0; i < (int)ret.size(); i++) ret[i] = (*this)[i] * r[i];
return ret;
}
// 前 sz 項を取ってくる。sz に足りない項は 0 埋めする
FPS pre(int sz) const {
FPS ret(begin(*this), begin(*this) + min((int)this->size(), sz));
if ((int)ret.size() < sz) ret.resize(sz);
return ret;
}
FPS operator>>(int sz) const {
if ((int)this->size() <= sz) return {};
FPS ret(*this);
ret.erase(ret.begin(), ret.begin() + sz);
return ret;
}
FPS operator<<(int sz) const {
FPS ret(*this);
ret.insert(ret.begin(), sz, mint(0));
return ret;
}
FPS diff() const {
const int n = (int)this->size();
FPS ret(max(0, n - 1));
mint one(1), coeff(1);
for (int i = 1; i < n; i++) {
ret[i - 1] = (*this)[i] * coeff;
coeff += one;
}
return ret;
}
FPS integral() const {
const int n = (int)this->size();
FPS ret(n + 1);
ret[0] = mint(0);
if (n > 0) ret[1] = mint(1);
auto mod = mint::get_mod();
for (int i = 2; i <= n; i++) ret[i] = (-ret[mod % i]) * (mod / i);
for (int i = 0; i < n; i++) ret[i + 1] *= (*this)[i];
return ret;
}
mint eval(mint x) const {
mint r = 0, w = 1;
for (auto &v : *this) r += w * v, w *= x;
return r;
}
FPS log(int deg = -1) const {
assert(!(*this).empty() && (*this)[0] == mint(1));
if (deg == -1) deg = (int)this->size();
return (this->diff() * this->inv(deg)).pre(deg - 1).integral();
}
FPS pow(int64_t k, int deg = -1) const {
const int n = (int)this->size();
if (deg == -1) deg = n;
if (k == 0) {
FPS ret(deg);
if (deg) ret[0] = 1;
return ret;
}
for (int i = 0; i < n; i++) {
if ((*this)[i] != mint(0)) {
mint rev = mint(1) / (*this)[i];
FPS ret = (((*this * rev) >> i).log(deg) * k).exp(deg);
ret *= (*this)[i].pow(k);
ret = (ret << (i * k)).pre(deg);
if ((int)ret.size() < deg) ret.resize(deg, mint(0));
return ret;
}
if (__int128_t(i + 1) * k >= deg) return FPS(deg, mint(0));
}
return FPS(deg, mint(0));
}
static void *ntt_ptr;
static void set_fft();
FPS &operator*=(const FPS &r);
void ntt();
void intt();
void ntt_doubling();
static int ntt_pr();
FPS inv(int deg = -1) const;
FPS exp(int deg = -1) const;
};
template <typename mint>
void *FormalPowerSeries<mint>::ntt_ptr = nullptr;
/**
* @brief 多項式/形式的冪級数ライブラリ
* @docs docs/fps/formal-power-series.md
*/
template <typename mint>
struct ProductTree {
using fps = FormalPowerSeries<mint>;
const vector<mint> &xs;
vector<fps> buf;
int N, xsz;
vector<int> l, r;
ProductTree(const vector<mint> &xs_) : xs(xs_), xsz(xs.size()) {
N = 1;
while (N < (int)xs.size()) N *= 2;
buf.resize(2 * N);
l.resize(2 * N, xs.size());
r.resize(2 * N, xs.size());
fps::set_fft();
if (fps::ntt_ptr == nullptr)
build();
else
build_ntt();
}
void build() {
for (int i = 0; i < xsz; i++) {
l[i + N] = i;
r[i + N] = i + 1;
buf[i + N] = {-xs[i], 1};
}
for (int i = N - 1; i > 0; i--) {
l[i] = l[(i << 1) | 0];
r[i] = r[(i << 1) | 1];
if (buf[(i << 1) | 0].empty())
continue;
else if (buf[(i << 1) | 1].empty())
buf[i] = buf[(i << 1) | 0];
else
buf[i] = buf[(i << 1) | 0] * buf[(i << 1) | 1];
}
}
void build_ntt() {
fps f;
f.reserve(N * 2);
for (int i = 0; i < xsz; i++) {
l[i + N] = i;
r[i + N] = i + 1;
buf[i + N] = {-xs[i] + 1, -xs[i] - 1};
}
for (int i = N - 1; i > 0; i--) {
l[i] = l[(i << 1) | 0];
r[i] = r[(i << 1) | 1];
if (buf[(i << 1) | 0].empty())
continue;
else if (buf[(i << 1) | 1].empty())
buf[i] = buf[(i << 1) | 0];
else if (buf[(i << 1) | 0].size() == buf[(i << 1) | 1].size()) {
buf[i] = buf[(i << 1) | 0];
f.clear();
copy(begin(buf[(i << 1) | 1]), end(buf[(i << 1) | 1]),
back_inserter(f));
buf[i].ntt_doubling();
f.ntt_doubling();
for (int j = 0; j < (int)buf[i].size(); j++) buf[i][j] *= f[j];
} else {
buf[i] = buf[(i << 1) | 0];
f.clear();
copy(begin(buf[(i << 1) | 1]), end(buf[(i << 1) | 1]),
back_inserter(f));
buf[i].ntt_doubling();
f.intt();
f.resize(buf[i].size(), mint(0));
f.ntt();
for (int j = 0; j < (int)buf[i].size(); j++) buf[i][j] *= f[j];
}
}
for (int i = 0; i < 2 * N; i++) {
buf[i].intt();
buf[i].shrink();
}
}
};
template <typename mint>
vector<mint> InnerMultipointEvaluation(const FormalPowerSeries<mint> &f,
const vector<mint> &xs,
const ProductTree<mint> &ptree) {
using fps = FormalPowerSeries<mint>;
vector<mint> ret;
ret.reserve(xs.size());
auto rec = [&](auto self, fps a, int idx) {
if (ptree.l[idx] == ptree.r[idx]) return;
a %= ptree.buf[idx];
if ((int)a.size() <= 64) {
for (int i = ptree.l[idx]; i < ptree.r[idx]; i++)
ret.push_back(a.eval(xs[i]));
return;
}
self(self, a, (idx << 1) | 0);
self(self, a, (idx << 1) | 1);
};
rec(rec, f, 1);
return ret;
}
template <typename mint>
vector<mint> MultipointEvaluation(const FormalPowerSeries<mint> &f,
const vector<mint> &xs) {
if(f.empty() || xs.empty()) return vector<mint>(xs.size(), mint(0));
return InnerMultipointEvaluation(f, xs, ProductTree<mint>(xs));
}
/**
* @brief Multipoint Evaluation
*/
template <class mint>
FormalPowerSeries<mint> PolynomialInterpolation(const vector<mint> &xs,
const vector<mint> &ys) {
using fps = FormalPowerSeries<mint>;
assert(xs.size() == ys.size());
ProductTree<mint> ptree(xs);
fps w = ptree.buf[1].diff();
vector<mint> vs = InnerMultipointEvaluation<mint>(w, xs, ptree);
auto rec = [&](auto self, int idx) -> fps {
if (idx >= ptree.N) {
if (idx - ptree.N < (int)xs.size())
return {ys[idx - ptree.N] / vs[idx - ptree.N]};
else
return {mint(1)};
}
if (ptree.buf[idx << 1 | 0].empty())
return {};
else if (ptree.buf[idx << 1 | 1].empty())
return self(self, idx << 1 | 0);
return self(self, idx << 1 | 0) * ptree.buf[idx << 1 | 1] +
self(self, idx << 1 | 1) * ptree.buf[idx << 1 | 0];
};
return rec(rec, 1);
}
template <typename T>
struct edge {
int src, to;
T cost;
edge(int _to, T _cost) : src(-1), to(_to), cost(_cost) {}
edge(int _src, int _to, T _cost) : src(_src), to(_to), cost(_cost) {}
edge &operator=(const int &x) {
to = x;
return *this;
}
operator int() const { return to; }
};
template <typename T>
using Edges = vector<edge<T>>;
template <typename T>
using WeightedGraph = vector<Edges<T>>;
using UnweightedGraph = vector<vector<int>>;
// Input of (Unweighted) Graph
UnweightedGraph graph(int N, int M = -1, bool is_directed = false,
bool is_1origin = true) {
UnweightedGraph g(N);
if (M == -1) M = N - 1;
for (int _ = 0; _ < M; _++) {
int x, y;
cin >> x >> y;
if (is_1origin) x--, y--;
g[x].push_back(y);
if (!is_directed) g[y].push_back(x);
}
return g;
}
// Input of Weighted Graph
template <typename T>
WeightedGraph<T> wgraph(int N, int M = -1, bool is_directed = false,
bool is_1origin = true) {
WeightedGraph<T> g(N);
if (M == -1) M = N - 1;
for (int _ = 0; _ < M; _++) {
int x, y;
cin >> x >> y;
T c;
cin >> c;
if (is_1origin) x--, y--;
g[x].emplace_back(x, y, c);
if (!is_directed) g[y].emplace_back(y, x, c);
}
return g;
}
// Input of Edges
template <typename T>
Edges<T> esgraph([[maybe_unused]] int N, int M, int is_weighted = true,
bool is_1origin = true) {
Edges<T> es;
for (int _ = 0; _ < M; _++) {
int x, y;
cin >> x >> y;
T c;
if (is_weighted)
cin >> c;
else
c = 1;
if (is_1origin) x--, y--;
es.emplace_back(x, y, c);
}
return es;
}
// Input of Adjacency Matrix
template <typename T>
vector<vector<T>> adjgraph(int N, int M, T INF, int is_weighted = true,
bool is_directed = false, bool is_1origin = true) {
vector<vector<T>> d(N, vector<T>(N, INF));
for (int _ = 0; _ < M; _++) {
int x, y;
cin >> x >> y;
T c;
if (is_weighted)
cin >> c;
else
c = 1;
if (is_1origin) x--, y--;
d[x][y] = c;
if (!is_directed) d[y][x] = c;
}
return d;
}
/**
* @brief グラフテンプレート
* @docs docs/graph/graph-template.md
*/
//
template <typename mint>
struct NTT {
static constexpr uint32_t get_pr() {
uint32_t _mod = mint::get_mod();
using u64 = uint64_t;
u64 ds[32] = {};
int idx = 0;
u64 m = _mod - 1;
for (u64 i = 2; i * i <= m; ++i) {
if (m % i == 0) {
ds[idx++] = i;
while (m % i == 0) m /= i;
}
}
if (m != 1) ds[idx++] = m;
uint32_t _pr = 2;
while (1) {
int flg = 1;
for (int i = 0; i < idx; ++i) {
u64 a = _pr, b = (_mod - 1) / ds[i], r = 1;
while (b) {
if (b & 1) r = r * a % _mod;
a = a * a % _mod;
b >>= 1;
}
if (r == 1) {
flg = 0;
break;
}
}
if (flg == 1) break;
++_pr;
}
return _pr;
};
static constexpr uint32_t mod = mint::get_mod();
static constexpr uint32_t pr = get_pr();
static constexpr int level = __builtin_ctzll(mod - 1);
mint dw[level], dy[level];
void setwy(int k) {
mint w[level], y[level];
w[k - 1] = mint(pr).pow((mod - 1) / (1 << k));
y[k - 1] = w[k - 1].inverse();
for (int i = k - 2; i > 0; --i)
w[i] = w[i + 1] * w[i + 1], y[i] = y[i + 1] * y[i + 1];
dw[1] = w[1], dy[1] = y[1], dw[2] = w[2], dy[2] = y[2];
for (int i = 3; i < k; ++i) {
dw[i] = dw[i - 1] * y[i - 2] * w[i];
dy[i] = dy[i - 1] * w[i - 2] * y[i];
}
}
NTT() { setwy(level); }
void fft4(vector<mint> &a, int k) {
if ((int)a.size() <= 1) return;
if (k == 1) {
mint a1 = a[1];
a[1] = a[0] - a[1];
a[0] = a[0] + a1;
return;
}
if (k & 1) {
int v = 1 << (k - 1);
for (int j = 0; j < v; ++j) {
mint ajv = a[j + v];
a[j + v] = a[j] - ajv;
a[j] += ajv;
}
}
int u = 1 << (2 + (k & 1));
int v = 1 << (k - 2 - (k & 1));
mint one = mint(1);
mint imag = dw[1];
while (v) {
// jh = 0
{
int j0 = 0;
int j1 = v;
int j2 = j1 + v;
int j3 = j2 + v;
for (; j0 < v; ++j0, ++j1, ++j2, ++j3) {
mint t0 = a[j0], t1 = a[j1], t2 = a[j2], t3 = a[j3];
mint t0p2 = t0 + t2, t1p3 = t1 + t3;
mint t0m2 = t0 - t2, t1m3 = (t1 - t3) * imag;
a[j0] = t0p2 + t1p3, a[j1] = t0p2 - t1p3;
a[j2] = t0m2 + t1m3, a[j3] = t0m2 - t1m3;
}
}
// jh >= 1
mint ww = one, xx = one * dw[2], wx = one;
for (int jh = 4; jh < u;) {
ww = xx * xx, wx = ww * xx;
int j0 = jh * v;
int je = j0 + v;
int j2 = je + v;
for (; j0 < je; ++j0, ++j2) {
mint t0 = a[j0], t1 = a[j0 + v] * xx, t2 = a[j2] * ww,
t3 = a[j2 + v] * wx;
mint t0p2 = t0 + t2, t1p3 = t1 + t3;
mint t0m2 = t0 - t2, t1m3 = (t1 - t3) * imag;
a[j0] = t0p2 + t1p3, a[j0 + v] = t0p2 - t1p3;
a[j2] = t0m2 + t1m3, a[j2 + v] = t0m2 - t1m3;
}
xx *= dw[__builtin_ctzll((jh += 4))];
}
u <<= 2;
v >>= 2;
}
}
void ifft4(vector<mint> &a, int k) {
if ((int)a.size() <= 1) return;
if (k == 1) {
mint a1 = a[1];
a[1] = a[0] - a[1];
a[0] = a[0] + a1;
return;
}
int u = 1 << (k - 2);
int v = 1;
mint one = mint(1);
mint imag = dy[1];
while (u) {
// jh = 0
{
int j0 = 0;
int j1 = v;
int j2 = v + v;
int j3 = j2 + v;
for (; j0 < v; ++j0, ++j1, ++j2, ++j3) {
mint t0 = a[j0], t1 = a[j1], t2 = a[j2], t3 = a[j3];
mint t0p1 = t0 + t1, t2p3 = t2 + t3;
mint t0m1 = t0 - t1, t2m3 = (t2 - t3) * imag;
a[j0] = t0p1 + t2p3, a[j2] = t0p1 - t2p3;
a[j1] = t0m1 + t2m3, a[j3] = t0m1 - t2m3;
}
}
// jh >= 1
mint ww = one, xx = one * dy[2], yy = one;
u <<= 2;
for (int jh = 4; jh < u;) {
ww = xx * xx, yy = xx * imag;
int j0 = jh * v;
int je = j0 + v;
int j2 = je + v;
for (; j0 < je; ++j0, ++j2) {
mint t0 = a[j0], t1 = a[j0 + v], t2 = a[j2], t3 = a[j2 + v];
mint t0p1 = t0 + t1, t2p3 = t2 + t3;
mint t0m1 = (t0 - t1) * xx, t2m3 = (t2 - t3) * yy;
a[j0] = t0p1 + t2p3, a[j2] = (t0p1 - t2p3) * ww;
a[j0 + v] = t0m1 + t2m3, a[j2 + v] = (t0m1 - t2m3) * ww;
}
xx *= dy[__builtin_ctzll(jh += 4)];
}
u >>= 4;
v <<= 2;
}
if (k & 1) {
u = 1 << (k - 1);
for (int j = 0; j < u; ++j) {
mint ajv = a[j] - a[j + u];
a[j] += a[j + u];
a[j + u] = ajv;
}
}
}
void ntt(vector<mint> &a) {
if ((int)a.size() <= 1) return;
fft4(a, __builtin_ctz(a.size()));
}
void intt(vector<mint> &a) {
if ((int)a.size() <= 1) return;
ifft4(a, __builtin_ctz(a.size()));
mint iv = mint(a.size()).inverse();
for (auto &x : a) x *= iv;
}
vector<mint> multiply(const vector<mint> &a, const vector<mint> &b) {
int l = a.size() + b.size() - 1;
if (min<int>(a.size(), b.size()) <= 40) {
vector<mint> s(l);
for (int i = 0; i < (int)a.size(); ++i)
for (int j = 0; j < (int)b.size(); ++j) s[i + j] += a[i] * b[j];
return s;
}
int k = 2, M = 4;
while (M < l) M <<= 1, ++k;
setwy(k);
vector<mint> s(M);
for (int i = 0; i < (int)a.size(); ++i) s[i] = a[i];
fft4(s, k);
if (a.size() == b.size() && a == b) {
for (int i = 0; i < M; ++i) s[i] *= s[i];
} else {
vector<mint> t(M);
for (int i = 0; i < (int)b.size(); ++i) t[i] = b[i];
fft4(t, k);
for (int i = 0; i < M; ++i) s[i] *= t[i];
}
ifft4(s, k);
s.resize(l);
mint invm = mint(M).inverse();
for (int i = 0; i < l; ++i) s[i] *= invm;
return s;
}
void ntt_doubling(vector<mint> &a) {
int M = (int)a.size();
auto b = a;
intt(b);
mint r = 1, zeta = mint(pr).pow((mint::get_mod() - 1) / (M << 1));
for (int i = 0; i < M; i++) b[i] *= r, r *= zeta;
ntt(b);
copy(begin(b), end(b), back_inserter(a));
}
};
template <typename mint>
void FormalPowerSeries<mint>::set_fft() {
if (!ntt_ptr) ntt_ptr = new NTT<mint>;
}
template <typename mint>
FormalPowerSeries<mint>& FormalPowerSeries<mint>::operator*=(
const FormalPowerSeries<mint>& r) {
if (this->empty() || r.empty()) {
this->clear();
return *this;
}
set_fft();
auto ret = static_cast<NTT<mint>*>(ntt_ptr)->multiply(*this, r);
return *this = FormalPowerSeries<mint>(ret.begin(), ret.end());
}
template <typename mint>
void FormalPowerSeries<mint>::ntt() {
set_fft();
static_cast<NTT<mint>*>(ntt_ptr)->ntt(*this);
}
template <typename mint>
void FormalPowerSeries<mint>::intt() {
set_fft();
static_cast<NTT<mint>*>(ntt_ptr)->intt(*this);
}
template <typename mint>
void FormalPowerSeries<mint>::ntt_doubling() {
set_fft();
static_cast<NTT<mint>*>(ntt_ptr)->ntt_doubling(*this);
}
template <typename mint>
int FormalPowerSeries<mint>::ntt_pr() {
set_fft();
return static_cast<NTT<mint>*>(ntt_ptr)->pr;
}
template <typename mint>
FormalPowerSeries<mint> FormalPowerSeries<mint>::inv(int deg) const {
assert((*this)[0] != mint(0));
if (deg == -1) deg = (int)this->size();
FormalPowerSeries<mint> res(deg);
res[0] = {mint(1) / (*this)[0]};
for (int d = 1; d < deg; d <<= 1) {
FormalPowerSeries<mint> f(2 * d), g(2 * d);
for (int j = 0; j < min((int)this->size(), 2 * d); j++) f[j] = (*this)[j];
for (int j = 0; j < d; j++) g[j] = res[j];
f.ntt();
g.ntt();
for (int j = 0; j < 2 * d; j++) f[j] *= g[j];
f.intt();
for (int j = 0; j < d; j++) f[j] = 0;
f.ntt();
for (int j = 0; j < 2 * d; j++) f[j] *= g[j];
f.intt();
for (int j = d; j < min(2 * d, deg); j++) res[j] = -f[j];
}
return res.pre(deg);
}
template <typename mint>
FormalPowerSeries<mint> FormalPowerSeries<mint>::exp(int deg) const {
using fps = FormalPowerSeries<mint>;
assert((*this).size() == 0 || (*this)[0] == mint(0));
if (deg == -1) deg = this->size();
fps inv;
inv.reserve(deg + 1);
inv.push_back(mint(0));
inv.push_back(mint(1));
auto inplace_integral = [&](fps& F) -> void {
const int n = (int)F.size();
auto mod = mint::get_mod();
while ((int)inv.size() <= n) {
int i = inv.size();
inv.push_back((-inv[mod % i]) * (mod / i));
}
F.insert(begin(F), mint(0));
for (int i = 1; i <= n; i++) F[i] *= inv[i];
};
auto inplace_diff = [](fps& F) -> void {
if (F.empty()) return;
F.erase(begin(F));
mint coeff = 1, one = 1;
for (int i = 0; i < (int)F.size(); i++) {
F[i] *= coeff;
coeff += one;
}
};
fps b{1, 1 < (int)this->size() ? (*this)[1] : 0}, c{1}, z1, z2{1, 1};
for (int m = 2; m < deg; m *= 2) {
auto y = b;
y.resize(2 * m);
y.ntt();
z1 = z2;
fps z(m);
for (int i = 0; i < m; ++i) z[i] = y[i] * z1[i];
z.intt();
fill(begin(z), begin(z) + m / 2, mint(0));
z.ntt();
for (int i = 0; i < m; ++i) z[i] *= -z1[i];
z.intt();
c.insert(end(c), begin(z) + m / 2, end(z));
z2 = c;
z2.resize(2 * m);
z2.ntt();
fps x(begin(*this), begin(*this) + min<int>(this->size(), m));
x.resize(m);
inplace_diff(x);
x.push_back(mint(0));
x.ntt();
for (int i = 0; i < m; ++i) x[i] *= y[i];
x.intt();
x -= b.diff();
x.resize(2 * m);
for (int i = 0; i < m - 1; ++i) x[m + i] = x[i], x[i] = mint(0);
x.ntt();
for (int i = 0; i < 2 * m; ++i) x[i] *= z2[i];
x.intt();
x.pop_back();
inplace_integral(x);
for (int i = m; i < min<int>(this->size(), 2 * m); ++i) x[i] += (*this)[i];
fill(begin(x), begin(x) + m, mint(0));
x.ntt();
for (int i = 0; i < 2 * m; ++i) x[i] *= y[i];
x.intt();
b.insert(end(b), begin(x) + m, end(x));
}
return fps{begin(b), begin(b) + deg};
}
/**
* @brief NTT mod用FPSライブラリ
* @docs docs/fps/ntt-friendly-fps.md
*/
template <uint32_t mod>
struct LazyMontgomeryModInt {
using mint = LazyMontgomeryModInt;
using i32 = int32_t;
using u32 = uint32_t;
using u64 = uint64_t;
static constexpr u32 get_r() {
u32 ret = mod;
for (i32 i = 0; i < 4; ++i) ret *= 2 - mod * ret;
return ret;
}
static constexpr u32 r = get_r();
static constexpr u32 n2 = -u64(mod) % mod;
static_assert(mod < (1 << 30), "invalid, mod >= 2 ^ 30");
static_assert((mod & 1) == 1, "invalid, mod % 2 == 0");
static_assert(r * mod == 1, "this code has bugs.");
u32 a;
constexpr LazyMontgomeryModInt() : a(0) {}
constexpr LazyMontgomeryModInt(const int64_t &b)
: a(reduce(u64(b % mod + mod) * n2)){};
static constexpr u32 reduce(const u64 &b) {
return (b + u64(u32(b) * u32(-r)) * mod) >> 32;
}
constexpr mint &operator+=(const mint &b) {
if (i32(a += b.a - 2 * mod) < 0) a += 2 * mod;
return *this;
}
constexpr mint &operator-=(const mint &b) {
if (i32(a -= b.a) < 0) a += 2 * mod;
return *this;
}
constexpr mint &operator*=(const mint &b) {
a = reduce(u64(a) * b.a);
return *this;
}
constexpr mint &operator/=(const mint &b) {
*this *= b.inverse();
return *this;
}
constexpr mint operator+(const mint &b) const { return mint(*this) += b; }
constexpr mint operator-(const mint &b) const { return mint(*this) -= b; }
constexpr mint operator*(const mint &b) const { return mint(*this) *= b; }
constexpr mint operator/(const mint &b) const { return mint(*this) /= b; }
constexpr bool operator==(const mint &b) const {
return (a >= mod ? a - mod : a) == (b.a >= mod ? b.a - mod : b.a);
}
constexpr bool operator!=(const mint &b) const {
return (a >= mod ? a - mod : a) != (b.a >= mod ? b.a - mod : b.a);
}
constexpr mint operator-() const { return mint() - mint(*this); }
constexpr mint operator+() const { return mint(*this); }
constexpr mint pow(u64 n) const {
mint ret(1), mul(*this);
while (n > 0) {
if (n & 1) ret *= mul;
mul *= mul;
n >>= 1;
}
return ret;
}
constexpr mint inverse() const {
int x = get(), y = mod, u = 1, v = 0, t = 0, tmp = 0;
while (y > 0) {
t = x / y;
x -= t * y, u -= t * v;
tmp = x, x = y, y = tmp;
tmp = u, u = v, v = tmp;
}
return mint{u};
}
friend ostream &operator<<(ostream &os, const mint &b) {
return os << b.get();
}
friend istream &operator>>(istream &is, mint &b) {
int64_t t;
is >> t;
b = LazyMontgomeryModInt<mod>(t);
return (is);
}
constexpr u32 get() const {
u32 ret = reduce(a);
return ret >= mod ? ret - mod : ret;
}
static constexpr u32 get_mod() { return mod; }
};
using namespace std;
// コンストラクタの MAX に 「C(n, r) や fac(n) でクエリを投げる最大の n 」
// を入れると倍速くらいになる
// mod を超えて前計算して 0 割りを踏むバグは対策済み
template <typename T>
struct Binomial {
vector<T> f, g, h;
Binomial(int MAX = 0) {
assert(T::get_mod() != 0 && "Binomial<mint>()");
f.resize(1, T{1});
g.resize(1, T{1});
h.resize(1, T{1});
if (MAX > 0) extend(MAX + 1);
}
void extend(int m = -1) {
int n = f.size();
if (m == -1) m = n * 2;
m = min<int>(m, T::get_mod());
if (n >= m) return;
f.resize(m);
g.resize(m);
h.resize(m);
for (int i = n; i < m; i++) f[i] = f[i - 1] * T(i);
g[m - 1] = f[m - 1].inverse();
h[m - 1] = g[m - 1] * f[m - 2];
for (int i = m - 2; i >= n; i--) {
g[i] = g[i + 1] * T(i + 1);
h[i] = g[i] * f[i - 1];
}
}
T fac(int i) {
if (i < 0) return T(0);
while (i >= (int)f.size()) extend();
return f[i];
}
T finv(int i) {
if (i < 0) return T(0);
while (i >= (int)g.size()) extend();
return g[i];
}
T inv(int i) {
if (i < 0) return -inv(-i);
while (i >= (int)h.size()) extend();
return h[i];
}
T C(int n, int r) {
if (n < 0 || n < r || r < 0) return T(0);
return fac(n) * finv(n - r) * finv(r);
}
inline T operator()(int n, int r) { return C(n, r); }
template <typename I>
T multinomial(const vector<I>& r) {
static_assert(is_integral<I>::value == true);
int n = 0;
for (auto& x : r) {
if (x < 0) return T(0);
n += x;
}
T res = fac(n);
for (auto& x : r) res *= finv(x);
return res;
}
template <typename I>
T operator()(const vector<I>& r) {
return multinomial(r);
}
T C_naive(int n, int r) {
if (n < 0 || n < r || r < 0) return T(0);
T ret = T(1);
r = min(r, n - r);
for (int i = 1; i <= r; ++i) ret *= inv(i) * (n--);
return ret;
}
T P(int n, int r) {
if (n < 0 || n < r || r < 0) return T(0);
return fac(n) * finv(n - r);
}
// [x^r] 1 / (1-x)^n
T H(long long n, long long r) {
if (n < 0 || r < 0) return T(0);
return r == 0 ? 1 : C(n + r - 1, r);
}
};
// #include "fps/arbitrary-fps.hpp"
//
using namespace Nyaan;
using mint = LazyMontgomeryModInt<998244353>;
// using mint = LazyMontgomeryModInt<1000000007>;
using vm = vector<mint>;
using vvm = vector<vm>;
Binomial<mint> C;
using fps = FormalPowerSeries<mint>;
using namespace Nyaan;
// mint binom[501][501];
fps naive(int N, vvi g) {
vi p = mkiota(N);
fps res(N + 1);
do {
int num = 0;
rep(i, N) {
int ok = 1;
each(j, g[i]) ok &= p[i] > p[j];
num += ok;
}
res[num] += 1;
} while (nxp(p));
return res;
}
mint calc_sub(vvi g, mint a) {
trc(a);
a -= 1;
// (最大値候補の場合, 最大値候補でない場合の各値, サイズ)
auto dfs = [&](auto rc, int c, int par) -> tuple<fps, fps, int> {
// 最大値候補たちのうちの最小値に注目する
// f[i] : 最大値候補たちの値のうちの最小値が i 超過である場合
fps f;
// 最大値が存在しない場合 : 子の頂点の値の最大値に注目する
// g[i] : 子の頂点の値の最大値が i 以下である場合
fps f2;
each(d, g[c]) {
if (d == par) continue;
auto [x, z, s] = rc(rc, d, c);
assert(sz(z) == s);
if (f.empty()) {
repr(i, s - 1) x[i] += x[i + 1];
rep(i, s - 1) z[i + 1] += z[i];
f = x;
f2 = z;
continue;
}
trc(f, f2, x, z, s);
mint y = accumulate(begin(z), end(z), mint{0});
fps p(sz(f) + s), q(sz(f) + s);
// d が最大値候補でない場合, かつ f からの遷移
// i 番目の前に少なくとも j 個来る
rep(i, sz(f)) rep(j, s + 1) {
p[i + j] += f[i] * y * C(i + j, j) * C(sz(f) - i + s - j, s - j);
}
trc(p, q);
// d が最大値候補でない場合, かつ f2 からの遷移
rep(i, s - 1) z[i + 1] += z[i];
f2 = f2.rev(), z = z.rev();
rep(i, sz(f)) rep(j, s) {
q[i + j] += f2[i] * z[j] * C(i + j, j) * C(sz(f) - i + s - j, s - j);
}
f2 = f2.rev(), z = z.rev(), q = q.rev();
trc(p, q);
// d が最大値候補である場合
// i 超過かつ j 超過
repr(i, s - 1) x[i] += x[i + 1];
rep(i, sz(f)) rep(j, s) {
p[i + j] += f[i] * x[j] * C(i + j, j) * C(sz(f) - i + s - j, s - j);
}
trc(p, q);
mint w = f2.back();
// j 番目前にちょうど i 個来る
rep(i, sz(f) + 1) rep(j, s) {
p[i + j] += w * x[j] * C(i + j, j) * C(sz(f) - i + s - j, s - j);
}
trc(p, q);
f = p, f2 = q;
}
trc(c, f, f2);
if (f.empty()) return make_tuple(fps{a}, fps{1}, 1);
int s = sz(f);
// c が最大値候補の場合
fps x(s + 1);
// i の場合 : j<i
rep(i, s) x[i + 1] = f2[i];
x *= a;
// c が最大値候補でない場合
// 子が f2 の場合 : 自由
fps y(s + 1, f2.back());
// 子が f の場合
// i の場合 : (i<j) f[j] たちの和になる
rep(i, s) y[i] += f[i];
trc(c, x, y);
return make_tuple(x, y, s + 1);
};
auto [f, f2, s] = dfs(dfs, 0, -1);
trc(f, f2, s);
return accumulate(begin(f), end(f), mint{}) +
accumulate(begin(f2), end(f2), mint{});
}
fps calc(int N, vvi g) {
vm xs, ys;
rep1(a, N / 2 + 10) {
xs.push_back(a);
ys.push_back(calc_sub(g, a));
}
auto ans = PolynomialInterpolation(xs, ys);
ans.resize(N + 1, 0);
return ans;
}
void test() {
rep(t, TEN(3)) {
int N = rng(1, 8);
vvi g(N);
rep1(i, N - 1) {
int p = rng(0, i - 1);
g[p].push_back(i);
g[i].push_back(p);
}
auto an = naive(N, g);
auto ac = calc(N, g);
if (an != ac) {
trc(N, g);
trc(an);
trc(ac);
exit(1);
}
}
trc2("OK");
}
void q() {
Timer timer;
ini(N);
auto g = graph(N);
auto ans = calc(N, g);
ans.erase(begin(ans));
each(x, ans) out(x);
trc2(timer());
}
void Nyaan::solve() {
// test();
int t = 1;
// in(t);
while (t--) q();
}
详细
Test #1:
score: 100
Accepted
time: 0ms
memory: 3584kb
input:
5 1 2 1 3 2 4 2 5
output:
28 54 38 0 0
result:
ok 5 number(s): "28 54 38 0 0"
Test #2:
score: 0
Accepted
time: 0ms
memory: 3712kb
input:
10 6 10 5 9 10 3 9 10 7 4 4 1 3 2 3 7 8 4
output:
11540 253870 957220 1439080 737000 230090 0 0 0 0
result:
ok 10 numbers
Test #3:
score: 0
Accepted
time: 1ms
memory: 3712kb
input:
10 8 4 4 7 3 1 6 10 6 4 9 10 2 5 5 6 9 1
output:
7140 204390 1027380 1597560 731880 60450 0 0 0 0
result:
ok 10 numbers
Test #4:
score: 0
Accepted
time: 1ms
memory: 3712kb
input:
10 2 4 2 5 8 9 7 10 10 9 2 8 3 9 1 3 6 10
output:
14200 210620 1137900 1210580 811660 243840 0 0 0 0
result:
ok 10 numbers
Test #5:
score: 0
Accepted
time: 0ms
memory: 3712kb
input:
9 9 8 4 1 9 1 2 7 8 5 8 7 6 5 1 3
output:
2472 34356 162036 107292 56724 0 0 0 0
result:
ok 9 numbers
Test #6:
score: 0
Accepted
time: 0ms
memory: 3712kb
input:
10 3 8 4 7 8 6 4 6 6 10 9 1 3 2 4 5 9 10
output:
8800 148400 1210800 1396880 798640 65280 0 0 0 0
result:
ok 10 numbers
Test #7:
score: 0
Accepted
time: 0ms
memory: 3712kb
input:
15 14 9 7 13 7 8 3 6 1 15 4 15 7 11 8 1 2 7 14 8 15 5 10 6 2 10 12 1
output:
56289600 967779134 923981730 96060068 10686262 235209478 265673053 195831107 217488197 0 0 0 0 0 0
result:
ok 15 numbers
Test #8:
score: 0
Accepted
time: 0ms
memory: 3712kb
input:
15 6 9 10 12 6 10 7 15 9 7 8 15 4 12 11 1 13 6 2 9 3 12 1 3 9 14 7 5
output:
31011120 397655661 546345792 817109204 257395717 479471757 323343241 216283820 898626670 0 0 0 0 0 0
result:
ok 15 numbers
Test #9:
score: 0
Accepted
time: 0ms
memory: 3712kb
input:
15 9 3 9 5 9 6 11 15 5 11 4 14 1 15 2 1 13 14 8 1 9 7 7 14 10 2 12 2
output:
7023120 201832948 304836830 97923512 115869813 704294252 680848885 806741309 252218772 795653541 0 0 0 0 0
result:
ok 15 numbers
Test #10:
score: 0
Accepted
time: 0ms
memory: 3712kb
input:
14 5 4 3 7 9 4 3 8 10 9 1 2 10 7 4 11 14 2 5 1 2 12 4 13 6 11
output:
1277136 187034232 817102492 231238823 482826933 368166096 908219189 329900647 0 0 0 0 0 0
result:
ok 14 numbers
Test #11:
score: 0
Accepted
time: 1ms
memory: 3712kb
input:
15 9 12 1 9 13 10 7 4 11 6 7 3 14 1 11 3 15 14 11 10 2 10 5 12 1 13 12 8
output:
9790200 299361307 878733115 457013044 633916410 202070873 627253395 427436036 431668602 0 0 0 0 0 0
result:
ok 15 numbers
Test #12:
score: 0
Accepted
time: 0ms
memory: 3712kb
input:
30 21 17 4 6 30 28 12 19 3 6 18 11 5 17 13 30 3 27 5 28 7 30 3 25 3 7 27 24 4 16 20 26 30 1 5 9 9 2 23 12 13 20 17 19 22 14 18 20 17 14 11 29 10 27 15 23 11 8
output:
476665504 833146853 594913132 343840733 858440316 821830796 654815681 964050488 845418488 904523186 295267527 167669554 262061667 391216026 785126836 458297537 593077098 789556990 0 0 0 0 0 0 0 0 0 0 0 0
result:
ok 30 numbers
Test #13:
score: 0
Accepted
time: 1ms
memory: 3584kb
input:
30 13 21 15 29 9 3 22 8 3 15 15 25 14 8 19 8 24 27 28 4 12 27 8 18 28 25 24 25 8 9 21 5 7 17 11 23 11 16 3 11 26 10 10 16 8 7 11 20 27 21 26 30 15 6 1 6 2 28
output:
249311566 811045480 794072210 750170140 651800148 196077467 477989528 572918836 242191488 523238077 544740575 334825331 251208738 982415005 179148017 25972277 259519791 198540679 0 0 0 0 0 0 0 0 0 0 0 0
result:
ok 30 numbers
Test #14:
score: 0
Accepted
time: 1ms
memory: 3712kb
input:
30 10 11 7 29 9 30 4 12 20 18 30 15 3 30 18 16 23 1 22 6 29 25 29 5 16 14 25 27 15 13 24 5 14 22 23 5 1 19 2 11 7 15 26 29 12 21 26 14 12 20 15 28 27 10 17 26 8 26
output:
951802166 75337913 968695388 666501385 268553896 268591487 700091004 819234540 144322774 215302608 21960660 240875748 383482009 549084481 792698573 853681515 56586856 68382350 0 0 0 0 0 0 0 0 0 0 0 0
result:
ok 30 numbers
Test #15:
score: 0
Accepted
time: 1ms
memory: 3712kb
input:
29 5 13 18 19 7 2 10 16 2 3 28 22 17 14 25 29 14 8 27 17 9 6 15 11 7 20 8 1 15 12 13 18 9 26 10 23 10 5 17 7 9 24 10 17 21 29 22 1 16 24 4 28 20 21 20 11
output:
183093936 736732472 832827292 220921133 411064273 11608335 442961727 541248342 443664563 614435954 805482321 716726563 537008113 6091735 691949655 359540208 0 0 0 0 0 0 0 0 0 0 0 0 0
result:
ok 29 numbers
Test #16:
score: 0
Accepted
time: 1ms
memory: 3712kb
input:
30 1 17 27 23 2 19 28 7 17 22 20 23 9 27 9 5 11 13 7 24 9 11 13 28 16 9 8 3 22 16 29 16 8 24 22 18 22 14 10 11 13 6 4 18 21 9 25 28 17 12 16 30 27 15 24 2 26 24
output:
808671184 292518367 616199530 559639988 739602615 50200053 943966753 160098660 786551596 68220094 4828146 85859498 850152734 502065476 849914909 707591022 19104728 0 0 0 0 0 0 0 0 0 0 0 0 0
result:
ok 30 numbers
Test #17:
score: 0
Accepted
time: 1ms
memory: 3712kb
input:
30 2 1 3 1 1 4 4 5 6 5 4 7 8 6 9 8 9 10 9 11 9 12 11 13 14 11 12 15 13 16 15 17 18 17 19 16 19 20 20 21 19 22 22 23 22 24 22 25 26 24 24 27 28 26 29 26 27 30
output:
797780008 686571598 512601217 172589162 229077536 547622293 778878933 995407067 370565763 781815547 856193170 12039270 113119304 865952842 482288625 709423510 10626583 120877278 0 0 0 0 0 0 0 0 0 0 0 0
result:
ok 30 numbers
Test #18:
score: 0
Accepted
time: 4ms
memory: 3840kb
input:
70 48 32 5 25 9 43 42 18 13 35 32 28 17 66 53 36 21 52 47 17 20 34 67 13 34 40 52 36 49 50 11 66 30 32 44 43 20 51 47 56 6 66 11 24 69 50 39 19 11 30 9 62 18 21 68 34 69 39 28 10 14 24 4 30 67 47 44 6 66 22 65 1 42 16 59 8 12 50 32 45 24 60 46 17 69 8 43 41 33 61 27 2 22 2 8 67 60 52 55 15 13 61 37 ...
output:
943526961 320961617 166604850 701811460 389268693 738553375 215044618 451762417 891005935 810701751 125288699 585534137 985892828 931011067 707058487 7650954 536390154 943272279 709112563 723959681 929197521 402121766 553250601 260050045 712455754 1522617 370081754 452796510 644890353 36138167 57584...
result:
ok 70 numbers
Test #19:
score: 0
Accepted
time: 3ms
memory: 3840kb
input:
70 55 32 44 27 40 6 52 42 39 67 56 64 21 43 7 48 62 59 1 26 31 13 44 1 18 39 15 64 46 48 28 5 12 47 39 19 30 66 43 56 37 22 4 26 2 40 9 2 34 12 18 15 18 6 28 68 30 40 37 31 30 57 24 52 43 47 22 15 20 29 47 62 18 10 2 70 61 12 47 28 1 52 23 38 58 16 4 49 49 28 57 3 23 24 15 17 70 16 51 8 31 69 60 29 ...
output:
25910015 163992214 232378033 119711775 187475131 195677641 426749502 361226824 176083776 463491958 727433469 889576680 332436759 809785997 718639576 39870971 540913995 428104678 799845288 976730249 521491333 365953390 479106938 328510082 604649102 755282530 253636597 836671759 332287833 682395480 50...
result:
ok 70 numbers
Test #20:
score: 0
Accepted
time: 4ms
memory: 3840kb
input:
69 63 5 59 5 4 15 52 14 57 60 7 34 9 68 33 62 62 31 59 27 29 60 64 58 63 39 27 30 1 39 55 62 69 47 68 17 6 46 26 1 50 25 35 56 37 46 59 12 30 2 35 24 19 16 64 21 51 43 55 41 37 58 55 16 41 67 7 11 35 66 28 58 13 17 54 32 3 44 67 21 54 68 42 1 35 4 23 69 39 8 53 61 23 10 27 52 54 35 59 46 43 53 34 46...
output:
433178845 749347039 483550824 961302408 490763456 38943809 258235571 249129284 529624467 919699700 478839438 51132901 227139138 693529588 232856595 372323915 931822866 275207593 647509343 892538620 833150204 409551669 583012730 465413566 580934706 626121538 241910322 407826554 329925651 11988244 568...
result:
ok 69 numbers
Test #21:
score: 0
Accepted
time: 4ms
memory: 3712kb
input:
70 16 59 15 31 4 36 1 16 68 9 64 23 52 25 51 25 27 9 7 44 49 65 35 37 21 26 32 4 33 37 69 7 58 62 41 44 54 30 19 21 45 12 13 44 51 33 64 33 10 16 69 64 24 16 5 61 58 69 38 11 69 30 45 18 9 24 56 35 1 51 40 13 6 69 3 40 20 46 50 64 61 68 49 29 22 58 15 63 68 55 70 23 29 22 70 42 35 14 21 17 66 1 22 1...
output:
913892556 512515359 307932596 208166439 923812488 787814883 926522725 861402576 943667618 243713276 714542402 21996395 555468493 726536623 346707943 782684467 820344669 880144284 606053876 228354729 25060139 991208882 163764214 614834489 971165918 436603249 472900353 884414168 364542656 330974777 32...
result:
ok 70 numbers
Test #22:
score: 0
Accepted
time: 4ms
memory: 3840kb
input:
70 2 1 3 1 3 4 3 5 6 3 7 6 8 6 9 7 10 7 10 11 12 11 10 13 13 14 15 13 13 16 17 15 18 17 17 19 17 20 21 18 21 22 23 22 21 24 25 22 26 25 27 24 28 26 27 29 30 28 28 31 32 31 30 33 34 33 35 32 36 33 34 37 35 38 39 38 38 40 39 41 41 42 43 40 41 44 42 45 45 46 45 47 45 48 49 46 50 48 48 51 52 50 53 50 54...
output:
770169934 954555437 202257555 347334878 830323432 768480462 270384736 663728843 213556185 822256151 64172800 679424659 434554033 132510570 315113252 187753192 669137644 184968401 682886109 217514370 981985189 19129665 347549366 96071198 773619812 940957399 146067192 241287331 513595468 194094689 270...
result:
ok 70 numbers
Test #23:
score: 0
Accepted
time: 4ms
memory: 3840kb
input:
70 63 48 17 68 8 15 31 51 23 9 19 27 10 2 51 53 56 5 59 7 42 14 36 45 58 41 24 52 70 21 29 42 16 40 35 38 51 57 50 24 54 29 47 20 36 41 51 70 51 12 32 23 68 51 28 11 19 43 58 55 61 35 6 69 65 10 38 32 5 25 42 67 45 10 43 68 64 54 36 9 13 11 3 56 43 58 45 64 69 42 46 69 70 25 49 53 3 59 25 34 9 44 62...
output:
264422203 259298436 524867369 934958379 512456582 915748464 236380955 958526478 624343335 46856122 857595835 988798351 913132871 742485039 771978513 861720636 383944358 713516744 979650053 426134061 462415499 160845205 625982509 264284599 857319056 336185780 669646687 739448821 735484325 401233653 2...
result:
ok 70 numbers
Test #24:
score: 0
Accepted
time: 168ms
memory: 4352kb
input:
499 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 10 11 11 12 12 13 13 14 14 15 15 16 16 17 17 18 18 19 19 20 20 21 21 22 22 23 23 24 24 25 25 26 26 27 27 28 28 29 29 30 30 31 31 32 32 33 33 34 34 35 35 36 36 37 37 38 38 39 39 40 40 41 41 42 42 43 43 44 44 45 45 46 46 47 47 48 48 49 49 50 50 51 51 52 52 53 5...
output:
154029661 845001665 588557122 331004513 87119293 243589628 266481846 147445671 723892377 953399570 23874206 699082355 636337437 324612961 626615378 446859683 694059168 787587513 149004470 635734612 621444756 210884890 779365620 551506117 15704724 403748771 906444429 246784225 846106948 640128219 739...
result:
ok 499 numbers
Test #25:
score: 0
Accepted
time: 174ms
memory: 4352kb
input:
498 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 10 11 11 12 12 13 13 14 14 15 15 16 16 17 17 18 18 19 19 20 20 21 21 22 22 23 23 24 24 25 25 26 26 27 27 28 28 29 29 30 30 31 31 32 32 33 33 34 34 35 35 36 36 37 37 38 38 39 39 40 40 41 41 42 42 43 43 44 44 45 45 46 46 47 47 48 48 49 49 50 50 51 51 52 52 53 5...
output:
576137007 698536 705959869 459350169 613887621 376422552 900328015 918425372 851033096 643279868 515045927 107782280 474198026 593065562 958399880 98812746 600959826 162247473 259978802 763053996 89480037 867722997 92715192 529872829 910853989 935119642 95654181 955573778 151180755 97383478 30815805...
result:
ok 498 numbers
Test #26:
score: 0
Accepted
time: 125ms
memory: 4352kb
input:
449 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 10 11 11 12 12 13 13 14 14 15 15 16 16 17 17 18 18 19 19 20 20 21 21 22 22 23 23 24 24 25 25 26 26 27 27 28 28 29 29 30 30 31 31 32 32 33 33 34 34 35 35 36 36 37 37 38 38 39 39 40 40 41 41 42 42 43 43 44 44 45 45 46 46 47 47 48 48 49 49 50 50 51 51 52 52 53 5...
output:
751815647 426017185 189946231 837605210 831032354 558518285 609712385 770376473 693334904 134936351 532982601 250533254 139517032 523182123 20943426 27206945 383519608 556767776 27517590 500413486 826823026 418022166 434103911 995245814 561462243 103918631 698821468 459687218 593594456 251057760 800...
result:
ok 449 numbers
Test #27:
score: 0
Accepted
time: 89ms
memory: 4224kb
input:
398 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 10 11 11 12 12 13 13 14 14 15 15 16 16 17 17 18 18 19 19 20 20 21 21 22 22 23 23 24 24 25 25 26 26 27 27 28 28 29 29 30 30 31 31 32 32 33 33 34 34 35 35 36 36 37 37 38 38 39 39 40 40 41 41 42 42 43 43 44 44 45 45 46 46 47 47 48 48 49 49 50 50 51 51 52 52 53 5...
output:
816865800 985467713 971327665 632395692 196446727 434030679 627560633 627485844 690518955 454995971 243792985 450549538 100043661 886174999 104714586 987473276 24532275 653353159 139211535 243040095 979920292 162798353 813215115 604552457 213219564 149285135 67591743 54703787 644578633 662367371 938...
result:
ok 398 numbers
Test #28:
score: 0
Accepted
time: 14ms
memory: 3968kb
input:
205 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 10 11 11 12 12 13 13 14 14 15 15 16 16 17 17 18 18 19 19 20 20 21 21 22 22 23 23 24 24 25 25 26 26 27 27 28 28 29 29 30 30 31 31 32 32 33 33 34 34 35 35 36 36 37 37 38 38 39 39 40 40 41 41 42 42 43 43 44 44 45 45 46 46 47 47 48 48 49 49 50 50 51 51 52 52 53 5...
output:
753130417 109881001 685399927 861559523 151807032 22067972 614582330 316790429 378783717 575992167 91660065 720021539 865352199 971813962 435797246 865719812 619611866 937412322 908785703 927403083 612136223 897290670 901657475 401254407 359043429 459501291 47347742 420861174 906213402 353842071 581...
result:
ok 205 numbers
Test #29:
score: 0
Accepted
time: 45ms
memory: 4224kb
input:
317 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 10 11 11 12 12 13 13 14 14 15 15 16 16 17 17 18 18 19 19 20 20 21 21 22 22 23 23 24 24 25 25 26 26 27 27 28 28 29 29 30 30 31 31 32 32 33 33 34 34 35 35 36 36 37 37 38 38 39 39 40 40 41 41 42 42 43 43 44 44 45 45 46 46 47 47 48 48 49 49 50 50 51 51 52 52 53 5...
output:
537692343 70332772 131269515 673005701 470271276 733808699 437387223 925852785 517665139 598305587 815114704 735338355 630639875 169905755 142417305 877665425 232910454 933440866 86065313 658117379 740478559 66328597 653130205 664013451 540141148 375663590 811732978 974656532 822687271 842318519 648...
result:
ok 317 numbers
Test #30:
score: 0
Accepted
time: 12ms
memory: 3968kb
input:
195 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 10 11 11 12 12 13 13 14 14 15 15 16 16 17 17 18 18 19 19 20 20 21 21 22 22 23 23 24 24 25 25 26 26 27 27 28 28 29 29 30 30 31 31 32 32 33 33 34 34 35 35 36 36 37 37 38 38 39 39 40 40 41 41 42 42 43 43 44 44 45 45 46 46 47 47 48 48 49 49 50 50 51 51 52 52 53 5...
output:
77748471 398477838 589876897 629903989 552184816 787052062 874959254 688197019 964544174 66654714 385501062 703342362 923033837 26511983 988277234 187746498 191143482 840098727 119964152 811499910 309252543 763245158 468083088 423007512 670157523 205395175 724354927 254415808 210586892 252761012 319...
result:
ok 195 numbers
Test #31:
score: -100
Wrong Answer
time: 31ms
memory: 3840kb
input:
150 116 71 34 7 65 101 5 46 111 13 137 101 1 55 44 21 38 41 106 137 78 59 100 46 35 28 124 1 89 91 19 68 18 99 138 3 69 84 121 51 86 148 96 8 136 114 78 10 45 59 62 111 17 121 76 133 128 57 10 82 45 22 82 14 62 54 9 12 147 75 93 118 66 100 77 36 48 84 13 108 115 89 29 98 150 99 54 39 2 16 24 104 62 ...
output:
503605271 853321211 558903377 484236331 230851923 114901079 172970636 267323249 980838876 555876663 263625769 894024321 711367749 25031517 944726574 335320593 584290186 661725351 205541750 374202193 406328867 799847773 422840033 229683686 956454541 420839452 313548589 232460461 804894491 169900493 2...
result:
wrong answer 1st numbers differ - expected: '221296425', found: '503605271'