QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#582153#7927. Fortune TellingqwerasdfTL 2717ms169792kbC++208.0kb2024-09-22 15:30:182024-09-22 15:30:18

Judging History

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

  • [2024-09-22 15:30:18]
  • 评测
  • 测评结果:TL
  • 用时:2717ms
  • 内存:169792kb
  • [2024-09-22 15:30:18]
  • 提交

answer


#include <algorithm>
#include <cassert>
#include <tuple>
#include <vector>


#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 long long y = x * _m;
        return (unsigned int)(z - y + (z < y ? _m : 0));
    }
};

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


namespace atcoder {

long long pow_mod(long long x, long long n, int m) {
    assert(0 <= n && 1 <= m);
    if (m == 1) return 0;
    internal::barrett bt((unsigned int)(m));
    unsigned int r = 1, y = (unsigned int)(internal::safe_mod(x, m));
    while (n) {
        if (n & 1) r = bt.mul(r, y);
        y = bt.mul(y, y);
        n >>= 1;
    }
    return r;
}

long long inv_mod(long long x, long long m) {
    assert(1 <= m);
    auto z = internal::inv_gcd(x, m);
    assert(z.first == 1);
    return z.second;
}

std::pair<long long, long long> crt(const std::vector<long long>& r,
                                    const std::vector<long long>& m) {
    assert(r.size() == m.size());
    int n = int(r.size());
    long long r0 = 0, m0 = 1;
    for (int i = 0; i < n; i++) {
        assert(1 <= m[i]);
        long long r1 = internal::safe_mod(r[i], m[i]), m1 = m[i];
        if (m0 < m1) {
            std::swap(r0, r1);
            std::swap(m0, m1);
        }
        if (m0 % m1 == 0) {
            if (r0 % m1 != r1) return {0, 0};
            continue;
        }


        long long g, im;
        std::tie(g, im) = internal::inv_gcd(m0, m1);

        long long u1 = (m1 / g);
        if ((r1 - r0) % g) return {0, 0};

        long long x = (r1 - r0) / g % u1 * im % u1;

        r0 += x * m0;
        m0 *= u1;  // -> lcm(m0, m1)
        if (r0 < 0) r0 += m0;
    }
    return {r0, m0};
}

long long floor_sum(long long n, long long m, long long a, long long b) {
    assert(0 <= n && n < (1LL << 32));
    assert(1 <= m && m < (1LL << 32));
    unsigned long long ans = 0;
    if (a < 0) {
        unsigned long long a2 = internal::safe_mod(a, m);
        ans -= 1ULL * n * (n - 1) / 2 * ((a2 - a) / m);
        a = a2;
    }
    if (b < 0) {
        unsigned long long b2 = internal::safe_mod(b, m);
        ans -= 1ULL * n * ((b2 - b) / m);
        b = b2;
    }
    return ans + internal::floor_sum_unsigned(n, m, a, b);
}

}  // namespace atcoder

#include <bits/stdc++.h>
using namespace std;
using namespace atcoder; //https://github.com/atcoder/ac-library

#define rep(i, l, r) for (int i = (l); i < (r); i++)
#define bit(n, k) ((n >> k) & 1)
#define all(v) (v).begin(), (v).end()
typedef long long ll;
typedef pair<int, int> pii;

int get1(int n, int r){
    // 0,...,n-1
    int remove=(n-1)/6;
    if((n-1)%6>=r)remove++;
    return n-remove;
}

int get2(int k,int r){
    // 0,...,k
    int remove=k/6;
    if(k%6>=r)remove++;
    return k-remove;
}

void test_case(int tt){
    int n; cin>>n;
    map<pii,ll> dp;
    
    const int mod=998244353;
    ll six=inv_mod(6,998244353);
    //rep(i,2,7)cout<<inv_mod(i,998244353)<<'\n';
    //cout<<six<<'\n';
    dp[{1,0}]=1;
    function<ll(int,int)> solve=[&](int N, int k)->ll {
        if(N==0 || k>=N)return ll(0);
        if(dp.count({N,k})>0)return dp[{N,k}];
        ll &ret=dp[{N,k}];
        ret=0;
        if(N<6){
            //rep(i,0,n)cout<<N<<' '<<k<<' '<<i<<' '<<get(N,i)<<' '<<get(k,i)<<'\n';
            rep(i,0,N){
                if(k%6!=i%6){
                    ret=(ret+solve(get1(N,i),get2(k,i)))%mod;
                }
            }
            ret=(ret*inv_mod(N,998244353))%mod;
            //cout<<N<<' '<<k<<' '<<ret<<'\n';
            return ret;
        }
        // rep(i,0,6){
        //     if(k%6!=i%6){
        //         cout<<N<<' '<<k<<' '<<i<<' '<<get1(N,i)<<' '<<get2(k,i)<<'\n';
        //     }
        // }
        rep(i,0,6){
            if(k%6!=i%6){
                ret=(ret+(solve(get1(N,i),get2(k,i))*six%mod))%mod;
            }
        }
        //cout<<N<<' '<<k<<' '<<ret<<'\n';
        return ret;
    };
    rep(i,0,n)cout<<solve(n,i)<<'\n';
    return;
}

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(NULL);

    int t = 1;
    //cin>>t;
    rep(i, 1, t + 1)
    {
        test_case(i);
    }
    return 0;
}

详细

Test #1:

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

input:

3

output:

332748118
332748118
332748118

result:

ok 3 lines

Test #2:

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

input:

7

output:

305019108
876236710
876236710
876236710
876236710
876236710
305019108

result:

ok 7 lines

Test #3:

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

input:

8

output:

64701023
112764640
160828257
160828257
160828257
160828257
112764640
64701023

result:

ok 8 lines

Test #4:

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

input:

10

output:

409773145
853745402
299473306
743445563
189173467
189173467
743445563
299473306
853745402
409773145

result:

ok 10 lines

Test #5:

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

input:

11

output:

989514850
873566509
757618168
641669827
525721486
409773145
525721486
641669827
757618168
873566509
989514850

result:

ok 11 lines

Test #6:

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

input:

12

output:

175103562
138336949
101570336
64803723
28037110
989514850
989514850
28037110
64803723
101570336
138336949
175103562

result:

ok 12 lines

Test #7:

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

input:

13

output:

159099473
484299138
167572226
849089667
532362755
215635843
175103562
215635843
532362755
849089667
167572226
484299138
159099473

result:

ok 13 lines

Test #8:

score: 0
Accepted
time: 2717ms
memory: 169792kb

input:

131091

output:

567383016
662994174
732938392
473447067
205102363
749004511
410127252
89326957
304368813
405336094
96918015
896888521
737639871
508973310
349553790
121346210
739328699
633788498
95902577
411856713
705314547
568274283
647209576
401593169
250679135
133612309
639836192
600464933
338261759
832985164
518...

result:

ok 131091 lines

Test #9:

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

input:

14

output:

947151085
589891892
674722122
956565255
240164035
522007168
561598032
561598032
522007168
240164035
956565255
674722122
589891892
947151085

result:

ok 14 lines

Test #10:

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

input:

15

output:

637039767
460763713
462646547
333815057
96269873
856969042
271282146
750138182
271282146
856969042
96269873
333815057
462646547
460763713
637039767

result:

ok 15 lines

Test #11:

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

input:

16

output:

228892706
883702432
747017242
402641198
772461176
894058019
115446252
447880564
447880564
115446252
894058019
772461176
402641198
747017242
883702432
228892706

result:

ok 16 lines

Test #12:

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

input:

17

output:

903981410
862346530
997767939
885172564
487381090
33762637
823581070
80265784
832169836
80265784
823581070
33762637
487381090
885172564
997767939
862346530
903981410

result:

ok 17 lines

Test #13:

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

input:

18

output:

31744296
579723162
218537119
508969018
404962409
246598953
48644633
989179173
465496473
465496473
989179173
48644633
246598953
404962409
508969018
218537119
579723162
31744296

result:

ok 18 lines

Test #14:

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

input:

19

output:

856240157
861682308
431212253
293953179
552074030
697393155
911422408
885288577
288395015
423610073
288395015
885288577
911422408
697393155
552074030
293953179
431212253
861682308
856240157

result:

ok 19 lines

Test #15:

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

input:

2

output:

499122177
499122177

result:

ok 2 lines

Test #16:

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

input:

20

output:

308054940
613046471
627077388
876731984
177753318
168429486
670640271
198941540
78614976
772809215
772809215
78614976
198941540
670640271
168429486
177753318
876731984
627077388
613046471
308054940

result:

ok 20 lines

Test #17:

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

input:

21

output:

982695520
584249571
230343344
502166250
95786010
45929897
966423983
499961052
602742551
195298383
571250409
195298383
602742551
499961052
966423983
45929897
95786010
502166250
230343344
584249571
982695520

result:

ok 21 lines

Test #18:

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

input:

22

output:

966781769
485759206
207027266
706375129
431325017
29239160
854886038
860244349
975296442
757095317
214558602
214558602
757095317
975296442
860244349
854886038
29239160
431325017
706375129
207027266
485759206
966781769

result:

ok 22 lines

Test #19:

score: -100
Time Limit Exceeded

input:

220223

output:

904620830
570662262
259789297
26081430
875852152
157789135
813374609
696357431
573660829
912186928
302936478
446257515
508716017
720193773
61498818
573701804
35401989
335790053
147155562
720189556
202742334
898770323
563779215
679480614
964058891
284782141
780438196
409505450
327113979
435543803
703...

result: