QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#901928#10078. FS's Critical Concertlad1chkaAC ✓1096ms50092kbC++1712.0kb2025-02-16 03:50:082025-02-16 03:50:08

Judging History

This is the latest submission verdict.

  • [2025-02-16 03:50:08]
  • Judged
  • Verdict: AC
  • Time: 1096ms
  • Memory: 50092kb
  • [2025-02-16 03:50:08]
  • Submitted

answer

#define GLIBCXX_DEBUG
#include <bits/stdc++.h>
using namespace std;
mt19937_64 rng(chrono::steady_clock::now().time_since_epoch().count());
#define all(a) a.begin(), a.end()
#define rall(a) a.rbegin(), a.rend()
#define make_unique(a) sort(all(a)); a.resize(unique(all(a)) - a.begin())
#define fs first
#define sc second
#define th third
#define pb push_back
#define eb emplace_back
#define pob pop_back
#define vec vector
#define vsum(x) accumulate(x.begin(), x.end(), 0LL)
#define ins insert
#define rsz(x) resize(x)
#define sz(x) (int)(x.size())
#define ext extract
#define prq priority_queue
#define un_map unordered_map
#define un_multimap unordered_multimap
#define un_set unordered_set
#define un_multiset unordered_multiset
#define GET_MACRO(_1, _2, _3, _4, NAME, ...) NAME
#define FORN_1(end) for (auto iter_for_forn = 0; iter_for_forn < end; ++iter_for_forn)
#define FORN_2(iter, end) for (auto iter = 0; iter < end; ++iter)
#define FORN_3(iter, begin, end) for (auto iter = begin; iter < end; ++iter)
#define FORN_4(iter, begin, end, move) for (auto iter = begin; iter < end; iter+=move)
#define RFORN_1(begin) for (auto iter_for_rforn = (begin); iter_for_rforn >= 0; --iter_for_rforn)
#define RFORN_2(iter, end) for (auto iter = end-1; iter >= 0; --iter)
#define RFORN_3(iter, begin, end) for (auto iter = end-1; iter >= begin; --iter)
#define RFORN_4(iter, begin, end, move) for (auto iter = end-1; iter >= begin; iter-=move)
#define forn(...) GET_MACRO(__VA_ARGS__, FORN_4,FORN_3, FORN_2, FORN_1)(__VA_ARGS__)
#define rforn(...) GET_MACRO(__VA_ARGS__, RFORN_4,RFORN_3, RFORN_2, RFORN_1)(__VA_ARGS__)
#define each(el, arr) for (auto &el : arr)
#ifdef LOCAL
#define dbg(...) [](auto...zxc){ ((cout << zxc << ' '), ...) << endl;}(#__VA_ARGS__, ":", __VA_ARGS__)
#define dbgv(v) if(static_cast<string>(#v)!="_")cout<< #v <<" :"; cout << "[ "; for(auto &zxc: v) {cout << zxc << " ,"; }cout <<"]"<< endl;
#define dbgvv(v) {cout<< #v <<" :\n";int cnt = 0;for(auto &_: v) {cout << #v << "[" << cnt++ << "]: ";dbgv(_);}cout << endl;}
#define dbgm(v) cout<< #v <<" :"; for(auto &zxc: v) {cout << '\n' << zxc.fs << ": " << zxc.sc; }cout << endl;
#else
#define dbg(...)
#define dbgv(v)
#define dbgvv(v)
#define dbgm(v)
#endif
template<class T1, class T2, class T3>
struct triple {T1 first;T2 second;T3 third;triple() = default;
triple(const T1 &f, const T2 &s, const T3 &t) : first(f), second(s), third(t) {}
bool operator==(const triple &other) const {return tie(first, second, third) == tie(other.first, other.second, other.third);}
bool operator!=(const triple &other) const { return !(*this == other); }
bool operator<(const triple &other) const {return tie(first, second, third) < tie(other.first, other.second, other.third);}
bool operator<=(const triple &other) const { return !(*this > other); }
bool operator>(const triple &other) const {return tie(first, second, third) > tie(other.first, other.second, other.third);}
bool operator>=(const triple &other) const { return !(*this < other); }};
using vb = vector<bool>;using vvb = vector<vb>;using vvvb = vector<vvb>;
using vc = vector<char>;using vvc = vector<vc>;using vvvc = vector<vvc>;
using vi = vector<int>;using vvi = vector<vi>;using vvvi = vector<vvi>;using vvvvi = vector<vvvi>;using vvvvvi = vector<vvvvi>;
using ll = long long;using vl = vector<ll>;using vvl = vector<vl>;using vvvl = vector<vvl>;using vvvvl = vector<vvvl>;using vvvvvl = vector<vvvvl>;
using ld = long double;using vd = vector<ld>;using vvd = vector<vd>;using vvvd = vector<vvd>;
using pi = pair<int, int>;using vpi = vector<pi>;using vvpi = vector<vpi>;using vvvpi = vector<vvpi>;
using ti = triple<int, int, int>;using vti = vector<ti>;using vvti = vector<vti>;using vvvti = vector<vvti>;
using pl = pair<ll, ll>;using vpl = vector<pl>;using vvpl = vector<vpl>;using vvvpl = vector<vvpl>;
using tl = triple<ll, ll, ll>;using vtl = vector<tl>;using vvtl = vector<vtl>;using vvvtl = vector<vvtl>;
using pd = pair<ld, ld>;using vpd = vector<pd>;
using td = triple<ld, ld, ld>;using vtd = vector<td>;
using ull = unsigned long long;
using cld = complex<ld>;using cd = complex<double>;
template<class T1> istream &operator>>(istream &in, vector<T1> &a) { for (T1 &i: a) in >> i; return in;}
template<class T1, class T2> istream &operator>>(istream &in, vector<pair<T1, T2>> &a) { for (auto &[i1, i2]: a) in >> i1 >> i2; return in; }
template<class T1, class T2> istream &operator>>(istream &in, pair<T1, T2> &a) { in >> a.first >> a.second; return in; }
template<class T1, class T2, class T3> istream &operator>>(istream &in, vector<triple<T1, T2, T3>> &a) { for (auto &[i1, i2, i3]: a) in >> i1 >> i2 >> i3; return in; }
template<class T1, class T2, class T3> istream &operator>>(istream &in, triple<T1, T2, T3> &a) { in >> a.first >> a.second >> a.third; return in;}
template<class T1> ostream &operator<<(ostream &out, vector<T1> &a) { for (T1 &i: a) out << i << ' '; return out; }
template<class T1, class T2> ostream &operator<<(ostream &out, vector<pair<T1, T2>> &a) { for (auto &[i1, i2]: a) out << i1 << ' ' << i2 << '\n'; return out; }
template<class T1, class T2> ostream &operator<<(ostream &out, const pair<T1, T2> &a) { out << a.first << ' ' << a.second; return out; }
template<class T1, class T2, class T3> ostream &operator<<(ostream &out, vector<triple<T1, T2, T3>> &a) { for (auto &[i1, i2, i3]: a) out << i1 << ' ' << i2 << ' ' << i3 << '\n'; return out; }
template<class T1, class T2, class T3> ostream &operator<<(ostream &out, const triple<T1, T2, T3> &a) { out << a.first << ' ' << a.second << ' ' << a.third; return out; }
int BitSize(int64_t number) { int BitSizeAns = 1; while (number > 1) number >>= 1, BitSizeAns++; return BitSizeAns;}
int64_t Bit(int64_t number, int PosInNumber) { return (number >> PosInNumber) & 1; }
template <class T> T gcd(T a, T b) { while (b) a = a % b, swap(a, b); return a; }
template <class T> T gcd(vector<T> a) { T g = a[0]; each(el, a) g = gcd(g,el); return g; }
template <class T> T gcd(initializer_list<T> a) { T g = *a.begin(); each(el, a) g = gcd(g,el); return g; }
template <class T> T lcm(T a, T b){ return a / gcd(a,b) * b; }
template <class T> T lcm(vector<T> a) { T g = a[0]; each(el, a) g = lcm(g,el); return g; }
template <class T> T lcm(initializer_list<T> a) { T g = *a.begin(); each(el, a) g = lcm(g,el); return g; }
template<class T> bool ckmin(T &a, const T &b) { return b < a && (a = b); }
template<class T> bool ckmax(T &a, const T &b) { return b > a && (a = b); }
void coutans(bool ans) { ans ? cout << "YES" << '\n' : cout << "NO" << '\n'; }

const ll mod = 998244353;
int64_t poww(int64_t val, int64_t d, int64_t modd = mod) {int64_t ans = 1, mn = val;while (d) { if (d & 1) ans = mn * ans % modd; mn = mn * mn % modd, d >>= 1;}return ans;}


// Факториалы
vi f_fact(const int n) {
    vi fact(n, 1);
    forn(i,1,n) fact[i] = 1ll * fact[i-1] * i % mod;
    return fact;
}

// Обратные
vi f_inv(const int n){
    vi inv = f_fact(n);
    int ifact = poww(inv.back(), mod-2);
    rforn(i,2,n){
        inv[i] = 1ll * inv[i - 1] * ifact % mod;
        ifact = 1ll * ifact * i % mod;
    }
    return inv;
}

// Первообразый корень от простого
int primitive_root(int p){
    int phi = p-1, n = phi;
    vi fact;
    for (int i=2; i*i<=n; ++i)
        if (n % i == 0){ 
            fact.pb(i);
            while(n%i == 0) n/=i;
        }
    if(n!=1) fact.pb(n);
    forn(res,2,p+1){
        bool ok = 1;
        each(d, fact){
            ok &= (poww(res, phi/d) != 1);
            if(!ok) break;
        }
        if(ok) return res;
    }
    return -1;
}

// NTT
void NTT(vi &a){
    // need n = 2^d
    int n = sz(a);
    int d = __lg(n);
    int pr = primitive_root(mod);
    vi rev(n, 0);
    forn(j,n) rev[j] = (rev[j >> 1] >> 1) + ((j & 1) << (d-1));
    vi root(n, 1);
    for(int k = 1;k<n;k*=2){
        int p = poww(pr, (mod - 1) / (2 * k), mod);
        forn(i,1,k){
            root[k + i] = root[(k + i) >> 1];
            if(i&1) root[k+i] = (1ll * root[k+i] *p) % mod;
        }
    }
    forn(i,n) if (i < rev[i]) swap(a[i],a[rev[i]]);
    for (int k=1; k<n; k<<=1) {
        forn(i,0,n,2*k){
            forn(j,k){
                int tmp = 1ll * a[i+j+k] * root[k+j] % mod;
                a[i+j+k] = (a[i+j] - tmp + mod) % mod;
                a[i+j] = (a[i+j] + tmp) % mod;
            }
        }
    }
}

// Обратное NTT
void inv_NTT(vi &a){
    NTT(a);
    reverse(1+all(a));
    int inv_n = poww(sz(a), mod-2);
    forn(i,sz(a)) a[i] = (1ll * a[i] * inv_n) % mod;
}

// Сумма рядов
vi sum(const vi &a, const vi &b){
    vi c(max(sz(a), sz(b)));
    forn(i,sz(c)){
        if(i>=sz(a)) c[i] = b[i];
        else if(i>=sz(b)) c[i] = a[i];
        else c[i] = (a[i]+b[i])%mod;
    }
    return c;
}

// Разность рядов
vi diff(const vi &a, const vi &b){
    vi c(max(sz(a), sz(b)), 0);
    forn(i,sz(c)){
        if(i>=sz(a)) c[i] = (mod - b[i]) % mod;
        else if(i>=sz(b)) c[i] = a[i];
        else c[i] = (a[i] - b[i] + mod) % mod;
    }
    return c;
}

// Умножение рядов
vi mul(vi a, vi b){
    int n = sz(a), m = sz(b);
    int N = 1 << (__lg(n+m-2)+1);
    a.resize(N), b.resize(N);
    NTT(a), NTT(b);
    vi c(N);
    forn(i,N) c[i] = (1ll * a[i] * b[i]) % mod;
    inv_NTT(c);
    return c;
}
vi mul(vi a, vi b, int n){
    a.resize(n), b.resize(n);
    vi c = mul(a,b);
    c.resize(n);
    return c;
}

// Обратный ряд
vi inv(vi &a, int n){
    assert(a[0]!=0);
    vi A(1,a[0]);
    vi B(1,poww(a[0], 7-2,7));
    vi two {2};
    int bit = 1;
    while(sz(B) < n){
        int len = 1 << bit;
        forn(i, min(sz(a), sz(B)), min(len, sz(a))) A.pb(a[i]);
        B = mul(B, diff(two, mul(A, B, len)), min(n, len));
        bit++;
    }
    return B;
}

// Прозводная ряда
vi deriv(vi &a){
    vi da(sz(a) - 1);
    forn (i,1, sz(a)) da[i - 1] = (1ll * i * a[i]) % mod;
    return da;
}

// Интеграл от ряда
vi integ(vi &a){
    vi b(sz(a)+1);
    vi invs = f_inv(sz(b));
    forn(i,1,sz(a)+1) b[i] = 1ll * a[i-1] * invs[i] % mod;
    return b;
}

// Логарифм ряда
vi log(vi a, int n){
    assert(a[0]==1);
    a.resize(min(sz(a), n));
    if (n == 0) return a;
    a = mul(deriv(a), inv(a, n - 1), n - 1);
    return integ(a);
}

// Экспонента ряда
vi exp(vi A, int n){
    assert(A[0]==0);
    vi a(1);
    vi b(1,1);
    int bit = 1;
    while(sz(b) < n){
        int len = 1 << bit;
        vi ln_b = log(b,min(n,len));
        forn(i, sz(b), min(len, sz(A))) a.pb(A[i]);
        ln_b = diff(a,ln_b);
        (++ln_b[0])%= mod;
        b = mul(b, ln_b, min(len,n));
        bit++;
    }
    assert(b[0]==1);
    return b;
}   

// Ряд в степени (можно рациональной)
vi power(vi A, const int deg, const int n) {
    assert(A[0]==1);
    A = log(A, n);
    each(a,A) a = 1ll * a * deg % mod;
    A = exp(A, n);
    assert(A[0]==1);
    return A;
}

// ОПФ -> ЭПФ
vi EGF(vi ogf) {
    int ifact = 1, n = sz(ogf);
    forn(i,2,n) ifact = 1ll * ifact * i % mod;
    ifact = poww(ifact, mod-2);
    rforn(i,2,n){
        ogf[i] = 1ll * ogf[i] * ifact % mod;
        ifact = 1ll * ifact * i % mod;
    }
    return ogf;
}

// ЭПФ -> ОПФ
vi OGF(vi egf) {
    int fact = 1, n = sz(egf);
    forn(i,2,n){
        fact = 1ll * fact * i % mod;
        egf[i] = 1ll * egf[i] * fact % mod;
    }
    return egf;
}

void solve() {
    ll n; cin >> n; n++;
    vi G(n); 
    forn(i,n){
        int y = 1ll * i * (i-1) / 2 % (mod-1);
        G[i] = poww(2, y);
    }
    G = EGF(G);
    vi C = log(G,n);
    C[0] = 1;
    forn(i,n) C[i] = 1ll * C[i] * i % mod;
    vi CC = mul(C,C,n);
    vi ans = mul(G,CC,n);
    ans = OGF(ans);
    forn(i,n) ans[i] = 1ll * ans[i] * poww(2,mod-2) %mod;
    cout << ans[n-1] << '\n';
}
 
signed main() {
    ios::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr);
    int t = 1;
    // cin >> t;
    while (t--) solve();
}

詳細信息

Test #1:

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

input:

3

output:

9

result:

ok 1 number(s): "9"

Test #2:

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

input:

8

output:

130981312

result:

ok 1 number(s): "130981312"

Test #3:

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

input:

1

output:

0

result:

ok 1 number(s): "0"

Test #4:

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

input:

2

output:

1

result:

ok 1 number(s): "1"

Test #5:

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

input:

4

output:

96

result:

ok 1 number(s): "96"

Test #6:

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

input:

5

output:

1500

result:

ok 1 number(s): "1500"

Test #7:

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

input:

6

output:

37560

result:

ok 1 number(s): "37560"

Test #8:

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

input:

7

output:

1626912

result:

ok 1 number(s): "1626912"

Test #9:

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

input:

9

output:

591945260

result:

ok 1 number(s): "591945260"

Test #10:

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

input:

10

output:

877137661

result:

ok 1 number(s): "877137661"

Test #11:

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

input:

11

output:

654711510

result:

ok 1 number(s): "654711510"

Test #12:

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

input:

12

output:

896890421

result:

ok 1 number(s): "896890421"

Test #13:

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

input:

13

output:

544152239

result:

ok 1 number(s): "544152239"

Test #14:

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

input:

14

output:

203161729

result:

ok 1 number(s): "203161729"

Test #15:

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

input:

15

output:

686403302

result:

ok 1 number(s): "686403302"

Test #16:

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

input:

16

output:

551788068

result:

ok 1 number(s): "551788068"

Test #17:

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

input:

17

output:

778761614

result:

ok 1 number(s): "778761614"

Test #18:

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

input:

18

output:

372704747

result:

ok 1 number(s): "372704747"

Test #19:

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

input:

19

output:

48091879

result:

ok 1 number(s): "48091879"

Test #20:

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

input:

20

output:

811962966

result:

ok 1 number(s): "811962966"

Test #21:

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

input:

21

output:

580925653

result:

ok 1 number(s): "580925653"

Test #22:

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

input:

22

output:

473369147

result:

ok 1 number(s): "473369147"

Test #23:

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

input:

23

output:

370850086

result:

ok 1 number(s): "370850086"

Test #24:

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

input:

24

output:

633052748

result:

ok 1 number(s): "633052748"

Test #25:

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

input:

25

output:

760181773

result:

ok 1 number(s): "760181773"

Test #26:

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

input:

26

output:

618049730

result:

ok 1 number(s): "618049730"

Test #27:

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

input:

27

output:

197289938

result:

ok 1 number(s): "197289938"

Test #28:

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

input:

28

output:

708240707

result:

ok 1 number(s): "708240707"

Test #29:

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

input:

29

output:

726463024

result:

ok 1 number(s): "726463024"

Test #30:

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

input:

30

output:

587550457

result:

ok 1 number(s): "587550457"

Test #31:

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

input:

100

output:

721970458

result:

ok 1 number(s): "721970458"

Test #32:

score: 0
Accepted
time: 6ms
memory: 4096kb

input:

2562

output:

947609016

result:

ok 1 number(s): "947609016"

Test #33:

score: 0
Accepted
time: 6ms
memory: 3892kb

input:

3410

output:

462244613

result:

ok 1 number(s): "462244613"

Test #34:

score: 0
Accepted
time: 11ms
memory: 4096kb

input:

5712

output:

225049703

result:

ok 1 number(s): "225049703"

Test #35:

score: 0
Accepted
time: 21ms
memory: 4656kb

input:

10002

output:

577290168

result:

ok 1 number(s): "577290168"

Test #36:

score: 0
Accepted
time: 106ms
memory: 8804kb

input:

50012

output:

513616100

result:

ok 1 number(s): "513616100"

Test #37:

score: 0
Accepted
time: 216ms
memory: 13920kb

input:

75162

output:

197336463

result:

ok 1 number(s): "197336463"

Test #38:

score: 0
Accepted
time: 228ms
memory: 15064kb

input:

129257

output:

307374532

result:

ok 1 number(s): "307374532"

Test #39:

score: 0
Accepted
time: 490ms
memory: 26168kb

input:

202572

output:

342782823

result:

ok 1 number(s): "342782823"

Test #40:

score: 0
Accepted
time: 1029ms
memory: 46284kb

input:

348252

output:

992752188

result:

ok 1 number(s): "992752188"

Test #41:

score: 0
Accepted
time: 1096ms
memory: 49540kb

input:

452632

output:

374752381

result:

ok 1 number(s): "374752381"

Test #42:

score: 0
Accepted
time: 1086ms
memory: 50092kb

input:

500000

output:

553811795

result:

ok 1 number(s): "553811795"