QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#449298#7838. 往日之影Made_in_Code40 61ms31048kbC++143.9kb2024-06-20 21:48:322024-06-20 21:48:34

Judging History

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

  • [2024-06-20 21:48:34]
  • 评测
  • 测评结果:40
  • 用时:61ms
  • 内存:31048kb
  • [2024-06-20 21:48:32]
  • 提交

answer

#include <iostream>
#define LL long long

using namespace std;

const int kMaxN = 1e6 + 1, kMaxL = 20;
struct H {
  int pw, fact, _fact;
} h[kMaxN];
int t, p, n, a[4], d[4][4];

void Add(LL &x, LL y) { x = (x + y) % p; }

LL Pow(LL x, LL y) {
  LL ans = 1;
  for (LL i = 1; i <= y; i <<= 1) {
    if (i & y) {
      ans = ans * x % p;
    }
    x = x * x % p;
  }
  return ans;
}

class P {
 public:
  LL f[4];

  P() {
    f[0] = f[1] = f[2] = f[3] = 0;
  }

  P(LL f0, LL f1, LL f2, LL f3) {
    f[0] = f0, f[1] = f1, f[2] = f2, f[3] = f3;
  }

  P operator+(P x) {
    P ans;
    for (int i = 0; i < 4; i++) {
      ans.f[i] = (f[i] + x.f[i]) % p;
    }
    return ans;
  }

  P operator<<(LL x) {
    P ans;
    for (int i = 0; i < 4; i++) {
      ans.f[i + x & 3] = f[i];
    }
    return ans;
  }

  P operator*(LL x) {
    P ans;
    for (int i = 0; i < 4; i++) {
      ans.f[i] = f[i] * x % p;
    }
    return ans;
  }

  P operator*(P x) {
    P ans;
    for (int i = 0; i < 4; i++) {
      for (int j = 0; j < 4; j++) {
        Add(ans.f[i + j & 3], f[i] * x.f[j]);
      }
    }
    return ans;
  }

  P operator^(LL y) {
    P x = *this, ans(1, 0, 0, 0);
    for (LL i = 1; i <= y; i <<= 1) {
      if (i & y) {
        ans = ans * x;
      }
      x = x * x;
    }
    return ans;
  }
} ans;

void CalcFact() {
  int _r;
  LL pw[kMaxL], s[kMaxN], t[kMaxN];
  pw[0] = 1;
  for (int &i = _r = 1; i < kMaxL; i++) {
    pw[i] = pw[i - 1] * p;
    if (pw[i] >= kMaxN) {
      break;
    }
  }
  h[0] = {0, 1, 1};
  for (int i = 1; i < kMaxN; i++) {
    int l = 0, r = _r;
    while (l <= r) {
      int mid = l + r >> 1;
      if (mid <= _r && !(i % pw[mid])) {
        l = mid + 1;
      } else {
        r = mid - 1;
      }
    }
    h[i] = h[i - 1], h[i].pw += r;
    h[i].fact = h[i].fact * (i / pw[r]) % p;
  }
  s[0] = 1;
  for (int i = 1; i < kMaxN; i++) {
    s[i] = s[i - 1] * h[i].fact % p;
  }
  t[kMaxN - 1] = Pow(s[kMaxN - 1], p - 2);
  for (int i = kMaxN - 1; i > 0; i--) {
    t[i - 1] = t[i] * h[i].fact % p;
  }
  for (int i = 1; i < kMaxN; i++) {
    h[i]._fact = s[i - 1] * t[i] % p;
  }
}

void CalcAns(int o) {
  int b[4] = {};
  P w(o, 0, 0, 0);
  for (int i = 0; i < 4; i++) {
    for (int j = 0; j < 4; j++) {
      b[j] += d[i][j];
    }
  }
  for (int i = 0; i < 4; i++) {
    w.f[0] = w.f[0] * h[a[i]].fact % p;
    for (int j = 0; j < 4; j++) {
      w.f[0] = w.f[0] * h[d[i][j]]._fact % p;
    }
  }
  int q = (d[1][3] + d[3][1]) + 3 * (d[1][1] + d[3][3]) & 3;
  q = q + 2 * (d[1][2] + d[2][1] + d[2][3] + d[3][2]) & 3;
  w = w << q;
  for (int i = 0; i < 4; i++) {
    for (int j = i + 1; j < 4; j++) {
      P p(1, 0, 0, 0);
      p.f[i + j & 3] += 1;
      w = w * (p ^ b[i] * b[j]);
    }
  }
  for (int i = 0; i < 4; i++) {
    P p(1, 0, 0, 0);
    p.f[i + i & 3] += 1;
    w = w * (p ^ b[i] * (b[i] - 1) / 2);
  }
  ans = ans + w;
}

void S(int x, int b0, int b1, int b2, int b3, int o) {
  if (x == 4) {
    CalcAns(o);
    return;
  }
  for (int &i = d[x][0] = 0; i <= b0 && i <= a[x]; i++) {
    for (int &j = d[x][1] = 0; j <= b1 && i + j <= a[x]; j++) {
      for (int &k = d[x][2] = 0; k <= b2 && i + j + k <= a[x]; k++) {
        int &l = d[x][3] = a[x] - i - j - k;
        if (l <= b3 && h[i].pw + h[j].pw + h[k].pw + h[l].pw == h[a[x]].pw) {
          S(x + 1, b0 - i, b1 - j, b2 - k, b3 - l, o);
        }
      }
    }
  }
}

int main() {
  cin.tie(0), cout.tie(0);
  ios::sync_with_stdio(0);
  cin >> t >> p;
  CalcFact();
  while (t--) {
    cin >> n >> a[0] >> a[1] >> a[2] >> a[3];
    ans = P();
    S(0, 0, 1, n, 1, 1);
    S(0, n, 1, 0, 1, 1);
    S(0, 0, 1, 0, 1, p - 1);
    int q = p - 1 - 1LL * n * (n + 3) / 2 % (p - 1);
    cout << (ans.f[0] - ans.f[2] + p) * Pow(2, q) % p << '\n';
  }
  return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Subtask #1:

score: 10
Accepted

Test #1:

score: 10
Accepted
time: 31ms
memory: 30860kb

input:

1 998244353
3
1 1 0 1

output:

0

result:

ok single line: '0'

Test #2:

score: 0
Accepted
time: 39ms
memory: 31044kb

input:

1 998244353
7
0 2 1 4

output:

998069185

result:

ok single line: '998069185'

Test #3:

score: 0
Accepted
time: 31ms
memory: 30920kb

input:

1 998244353
4
0 1 0 3

output:

0

result:

ok single line: '0'

Test #4:

score: 0
Accepted
time: 30ms
memory: 30988kb

input:

1 998244353
2
1 0 1 0

output:

0

result:

ok single line: '0'

Test #5:

score: 0
Accepted
time: 27ms
memory: 30984kb

input:

1 998244353
6
2 1 0 3

output:

997696001

result:

ok single line: '997696001'

Test #6:

score: 0
Accepted
time: 31ms
memory: 31036kb

input:

1 998244353
2
1 0 1 0

output:

0

result:

ok single line: '0'

Subtask #2:

score: 20
Accepted

Dependency #1:

100%
Accepted

Test #7:

score: 20
Accepted
time: 34ms
memory: 30984kb

input:

1 998244353
40
11 9 9 11

output:

855684614

result:

ok single line: '855684614'

Test #8:

score: 0
Accepted
time: 30ms
memory: 30968kb

input:

1 998244353
39
12 8 7 12

output:

629648158

result:

ok single line: '629648158'

Test #9:

score: 0
Accepted
time: 34ms
memory: 30928kb

input:

1 998244353
38
13 8 9 8

output:

944107686

result:

ok single line: '944107686'

Test #10:

score: 0
Accepted
time: 31ms
memory: 30988kb

input:

1 998244353
37
16 7 7 7

output:

393700837

result:

ok single line: '393700837'

Test #11:

score: 0
Accepted
time: 27ms
memory: 30988kb

input:

4 998244353
10
0 3 2 5
9
2 1 1 5
10
1 2 3 4
9
4 0 3 2

output:

124779131
998235309
124779131
998236023

result:

ok 4 lines

Test #12:

score: 0
Accepted
time: 31ms
memory: 31036kb

input:

4 998244353
10
2 1 4 3
9
1 2 4 2
10
3 2 5 0
9
3 2 2 2

output:

124779131
998239593
124778655
998236261

result:

ok 4 lines

Test #13:

score: 0
Accepted
time: 35ms
memory: 30928kb

input:

4 998244353
10
1 4 1 4
9
2 0 5 2
10
3 5 1 1
9
6 1 1 1

output:

623900891
998239355
374338940
998231025

result:

ok 4 lines

Test #14:

score: 0
Accepted
time: 32ms
memory: 30916kb

input:

8 998244353
4
2 1 0 1
4
0 2 0 2
5
0 1 1 3
4
0 1 0 3
5
1 1 0 3
5
0 3 1 1
4
2 2 0 0
5
1 1 2 1

output:

0
0
995319809
0
997269505
995319809
982646785
996294657

result:

ok 8 lines

Test #15:

score: 0
Accepted
time: 24ms
memory: 31044kb

input:

8 998244353
4
2 1 0 1
4
3 0 1 0
4
0 2 2 0
5
2 0 1 2
5
1 2 0 2
5
0 1 1 3
5
0 1 1 3
4
1 1 1 1

output:

0
0
967049217
997269505
0
995319809
995319809
0

result:

ok 8 lines

Test #16:

score: 0
Accepted
time: 31ms
memory: 31040kb

input:

3 998244353
30
1 10 7 12
8
0 3 0 5
2
0 1 0 1

output:

54137262
998208177
0

result:

ok 3 lines

Subtask #3:

score: 10
Accepted

Dependency #2:

100%
Accepted

Test #17:

score: 10
Accepted
time: 30ms
memory: 30920kb

input:

1 998244353
99
12 22 33 32
15 998244353
7
1 2 2 2
6
1 2 1 2
6
1 1 3 1
7
0 3 1 3
7
1 1 2 3
7
3 1 0 3
6
1 2 1 2
7
1 2 2 2
7
3 3 0 1
6
1 1 3 1
7
5 1 0 1
6
3 0 1 2
6
2 0 0 4
7
2 0 1 4
6
4 1 0 1

output:

940435798

result:

ok single line: '940435798'

Test #18:

score: 0
Accepted
time: 31ms
memory: 31040kb

input:

1 998244353
98
27 29 23 19
15 998244353
7
2 2 1 2
6
0 1 2 3
6
0 2 2 2
6
6 0 0 0
7
4 1 1 1
7
2 1 1 3
7
2 1 1 3
7
2 3 1 1
7
3 3 0 1
6
3 1 1 1
6
3 1 1 1
7
2 1 1 3
6
1 1 3 1
6
1 1 3 1
6
2 0 4 0

output:

147819391

result:

ok single line: '147819391'

Test #19:

score: 0
Accepted
time: 31ms
memory: 31044kb

input:

3 998244353
70
15 17 13 25
20
8 3 4 5
10
3 2 5 0
15 998244353
7
5 1 0 1
6
0 1 4 1
7
1 3 2 1
6
1 0 1 4
7
2 2 1 2
7
2 1 1 3
7
2 3 1 1
6
6 0 0 0
6
3 2 1 0
7
2 3 1 1
7
1 1 2 3
6
2 1 2 1
6
1 2 1 2
6
1 1 1 3
7
2 2 3 0

output:

300715311
500913543
124778655

result:

ok 3 lines

Test #20:

score: 0
Accepted
time: 36ms
memory: 30912kb

input:

3 998244353
70
21 23 11 15
20
5 4 3 8
10
5 1 1 3
15 998244353
6
1 0 3 2
7
3 1 0 3
6
2 2 0 2
7
1 3 0 3
7
2 2 3 0
6
3 0 3 0
6
1 0 3 2
7
1 1 2 3
6
1 1 1 3
7
1 2 0 4
7
2 1 1 3
6
4 0 0 2
6
2 2 2 0
6
2 2 0 2
6
0 1 2 3

output:

367385542
500913543
374339416

result:

ok 3 lines

Test #21:

score: 0
Accepted
time: 31ms
memory: 30980kb

input:

10 998244353
9
2 4 1 2
10
3 4 1 2
10
1 2 3 4
10
2 3 4 1
10
3 1 3 3
9
0 4 3 2
9
2 3 1 3
10
4 2 2 2
9
4 1 1 3
9
2 3 1 3
15 998244353
7
1 3 0 3
6
3 2 1 0
6
0 2 0 4
6
0 4 2 0
7
1 3 0 3
6
1 1 3 1
6
1 4 1 0
7
1 1 2 3
6
2 3 0 1
7
3 1 2 1
6
4 0 2 0
6
2 2 2 0
6
2 1 2 1
7
3 2 2 0
6
0 0 4 2

output:

998236023
124778179
124779131
124778655
374340011
998239355
998236261
374339535
998233643
998236261

result:

ok 10 lines

Test #22:

score: 0
Accepted
time: 32ms
memory: 31048kb

input:

15 998244353
7
3 2 2 0
7
2 2 3 0
6
1 3 1 1
7
1 1 2 3
6
1 3 1 1
7
3 3 0 1
6
2 1 2 1
6
1 2 1 2
6
1 1 1 3
6
4 1 0 1
7
3 2 2 0
6
1 3 1 1
6
0 2 2 2
7
1 3 0 3
7
2 2 1 2

output:

998191041
998191041
998061569
998069185
998061569
998160577
997939713
997939713
997574145
997939713
998191041
998061569
997574145
998145345
998145345

result:

ok 15 lines

Subtask #4:

score: 0
Wrong Answer

Test #23:

score: 10
Accepted
time: 61ms
memory: 30936kb

input:

999 999999001
2
2 0 0 0
3
3 0 0 0
4
4 0 0 0
5
5 0 0 0
6
6 0 0 0
7
7 0 0 0
8
8 0 0 0
9
9 0 0 0
10
10 0 0 0
11
11 0 0 0
12
12 0 0 0
13
13 0 0 0
14
14 0 0 0
15
15 0 0 0
16
16 0 0 0
17
17 0 0 0
18
18 0 0 0
19
19 0 0 0
20
20 0 0 0
21
21 0 0 0
22
22 0 0 0
23
23 0 0 0
24
24 0 0 0
25
25 0 0 0
26
26 0 0 0
27...

output:

499999501
874999126
359374641
919920956
691222454
586081873
33512082
496961574
790501684
206445579
708073277
492142887
486007979
21786019
802052117
198521403
854660059
658779344
904643630
538486221
357736277
949763680
94144464
342842045
695164947
276856011
552666277
813428208
572457238
910726512
177...

result:

ok 999 lines

Test #24:

score: -10
Wrong Answer
time: 40ms
memory: 30980kb

input:

1 1000000933
154579
154579 0 0 0

output:

648494997

result:

wrong answer 1st lines differ - expected: '657848365', found: '648494997'

Subtask #5:

score: 0
Skipped

Dependency #1:

100%
Accepted

Dependency #2:

100%
Accepted

Dependency #3:

100%
Accepted

Dependency #4:

0%