QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#821460#9451. Expected Waiting TimeKKT89WA 437ms15308kbC++175.9kb2024-12-19 16:05:452024-12-19 16:05:45

Judging History

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

  • [2024-12-19 16:05:45]
  • 评测
  • 测评结果:WA
  • 用时:437ms
  • 内存:15308kb
  • [2024-12-19 16:05:45]
  • 提交

answer

#pragma GCC optimize("Ofast")
#include <bits/stdc++.h>
using namespace std;
typedef long long int ll;
typedef unsigned long long int ull;

mt19937_64 rng(chrono::steady_clock::now().time_since_epoch().count());
ll myRand(ll B) { return (ull)rng() % B; }

#line 2 "modint/arbitrary-modint.hpp"

#line 2 "modint/barrett-reduction.hpp"

#include <utility>
using namespace std;

struct Barrett {
    using u32 = unsigned int;
    using i64 = long long;
    using u64 = unsigned long long;
    u32 m;
    u64 im;
    Barrett() : m(), im() {}
    Barrett(int n) : m(n), im(u64(-1) / m + 1) {}
    constexpr inline i64 quo(u64 n) {
        u64 x = u64((__uint128_t(n) * im) >> 64);
        u32 r = n - x * m;
        return m <= r ? x - 1 : x;
    }
    constexpr inline i64 rem(u64 n) {
        u64 x = u64((__uint128_t(n) * im) >> 64);
        u32 r = n - x * m;
        return m <= r ? r + m : r;
    }
    constexpr inline pair<i64, int> quorem(u64 n) {
        u64 x = u64((__uint128_t(n) * im) >> 64);
        u32 r = n - x * m;
        if (m <= r) return {x - 1, r + m};
        return {x, r};
    }
    constexpr inline i64 pow(u64 n, i64 p) {
        u32 a = rem(n), r = m == 1 ? 0 : 1;
        while (p) {
            if (p & 1) r = rem(u64(r) * a);
            a = rem(u64(a) * a);
            p >>= 1;
        }
        return r;
    }
};
#line 4 "modint/arbitrary-modint.hpp"

template <int id> struct ArbitraryModIntBase {
    int x;

    ArbitraryModIntBase() : x(0) {}

    ArbitraryModIntBase(int64_t y) {
        int z = y % get_mod();
        if (z < 0) z += get_mod();
        x = z;
    }

    ArbitraryModIntBase &operator+=(const ArbitraryModIntBase &p) {
        if ((x += p.x) >= get_mod()) x -= get_mod();
        return *this;
    }

    ArbitraryModIntBase &operator-=(const ArbitraryModIntBase &p) {
        if ((x += get_mod() - p.x) >= get_mod()) x -= get_mod();
        return *this;
    }

    ArbitraryModIntBase &operator*=(const ArbitraryModIntBase &p) {
        x = rem((unsigned long long)x * p.x);
        return *this;
    }

    ArbitraryModIntBase &operator/=(const ArbitraryModIntBase &p) {
        *this *= p.inverse();
        return *this;
    }

    ArbitraryModIntBase operator-() const { return ArbitraryModIntBase(-x); }
    ArbitraryModIntBase operator+() const { return *this; }

    ArbitraryModIntBase operator+(const ArbitraryModIntBase &p) const { return ArbitraryModIntBase(*this) += p; }

    ArbitraryModIntBase operator-(const ArbitraryModIntBase &p) const { return ArbitraryModIntBase(*this) -= p; }

    ArbitraryModIntBase operator*(const ArbitraryModIntBase &p) const { return ArbitraryModIntBase(*this) *= p; }

    ArbitraryModIntBase operator/(const ArbitraryModIntBase &p) const { return ArbitraryModIntBase(*this) /= p; }

    bool operator==(const ArbitraryModIntBase &p) const { return x == p.x; }

    bool operator!=(const ArbitraryModIntBase &p) const { return x != p.x; }

    ArbitraryModIntBase inverse() const {
        int a = x, b = get_mod(), u = 1, v = 0, t;
        while (b > 0) {
            t = a / b;
            swap(a -= t * b, b);
            swap(u -= t * v, v);
        }
        return ArbitraryModIntBase(u);
    }

    ArbitraryModIntBase pow(int64_t n) const {
        ArbitraryModIntBase ret(1), mul(x);
        while (n > 0) {
            if (n & 1) ret *= mul;
            mul *= mul;
            n >>= 1;
        }
        return ret;
    }

    friend ostream &operator<<(ostream &os, const ArbitraryModIntBase &p) { return os << p.x; }

    friend istream &operator>>(istream &is, ArbitraryModIntBase &a) {
        int64_t t;
        is >> t;
        a = ArbitraryModIntBase(t);
        return (is);
    }

    int get() const { return x; }

    inline unsigned int rem(unsigned long long p) { return barrett().rem(p); }

    static inline Barrett &barrett() {
        static Barrett b;
        return b;
    }

    static inline int &get_mod() {
        static int mod = 0;
        return mod;
    }

    static void set_mod(int md) {
//        assert(0 < md && md <= (1LL << 30) - 1);
        get_mod() = md;
        barrett() = Barrett(md);
    }
};

using ArbitraryModInt = ArbitraryModIntBase<-1>;

/**
 * @brief modint (2^{30} 未満の任意 mod 用)
 */

// ax+by = gcd(a,b) の整数解を求める
// |x| <= |b|, |y| <= |a|
// https://onlinejudge.u-aizu.ac.jp/courses/library/6/NTL/1/NTL_1_E
ll extgcd(ll a, ll b, ll &x, ll &y) {
    ll d = a;
    if (b != 0) {
        d = extgcd(b, a % b, y, x);
        y -= a / b * x;
    } else {
        x = 1, y = 0;
    }
    return d;
}
// a^-1 (mod b) を求める
ll modinv(ll a, ll b) {
    assert(gcd(a, b) == 1);
    ll x, y;
    extgcd(a, b, x, y);
    return (x + b) % b;
}

int main() {
    cin.tie(nullptr);
    ios::sync_with_stdio(false);
    int q;
    cin >> q;
    while (q--) {
        int n, mod;
        cin >> n >> mod;
        ArbitraryModInt::set_mod(mod);
        ArbitraryModInt b, A, B;
        cin >> b >> A >> B;
        vector<ArbitraryModInt> C(n + 1), fac(n + 2), inv(n + 2);
        fac[0] = 1;
        for (int i = 1; i < fac.size(); ++i) {
            fac[i] = fac[i - 1] * i;
        }
        ArbitraryModInt uo = fac[n + 1].inverse();
        for (int i = n + 1; i >= 1; --i) {
            inv[i] = uo * fac[i - 1];
            uo *= i;
        }
        C[0] = 1;
        for (int i = 1; i <= n; ++i) {
            C[i] = C[i - 1] * inv[i + 1] * (4 * i - 2);
        }
        ArbitraryModInt res = 0, cnt = 0;
        ArbitraryModInt a = 0;
        for (int i = 1; i <= 2 * n; ++i) {
            b = (A * b + B);
            a += b + 1;
            if (i % 2 == 0) {
                cnt += C[i / 2 - 1] * C[n - i / 2];
            }
            res += (cnt * 2 - C[n] + mod) * a;
        }
        cout << res / C[n] << "\n";
    }
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

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

input:

5
1 1000000007 0 1 0
2 1000000007 0 1 1
2 7 5 2 3
3 31 15 6 24
20 1000000007 0 1 0

output:

1
12
1
21
879705565

result:

ok 5 number(s): "1 12 1 21 879705565"

Test #2:

score: 0
Accepted
time: 413ms
memory: 3944kb

input:

4400
3954 1000000007 0 1 0
1306 1000000007 0 1 0
3774 1000000007 0 1 0
3345 1000000007 0 1 0
891 1000000007 0 1 0
2462 1000000007 0 1 0
237 1000000007 0 1 0
26 1000000007 0 1 0
2510 1000000007 0 1 0
637 1000000007 0 1 0
3250 1000000007 0 1 0
3447 1000000007 0 1 0
1222 1000000007 0 1 0
133 1000000007...

output:

440618338
378292891
979368645
915766295
343598158
80867595
161627927
517387931
396936703
42785642
945720545
764273281
186237656
635777911
164064906
548455037
991964184
468137124
561243246
118562285
856945294
642467240
23673926
808943705
897417615
462422554
656411244
204288121
997894281
244685651
762...

result:

ok 4400 numbers

Test #3:

score: -100
Wrong Answer
time: 437ms
memory: 15308kb

input:

1019
338 1863833207 1820742817 1507924477 1822273457
770 1386304741 1088481071 1216187083 170973217
597 1604266739 620750027 196415899 456280997
105 1008587891 184044403 24836083 926135599
357 1165127407 440925347 1103369747 912263123
82 1639766993 263045351 631010551 1412721139
928 1715915153 25383...

output:

1694546219
1008358419
503615689
827110887
1038039398
1464574153
459666079
1553157487
926610657
894591788
672146374
224934723
299319127
1108207739
1567420583
1190429522
903276660
334301476
504577049
940899114
700565173
1395996273
766143910
173035001
558752169
1050819260
570340493
844160548
1260302621...

result:

wrong answer 1st numbers differ - expected: '1532578211', found: '1694546219'