QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#449298 | #7838. 往日之影 | Made_in_Code | 40 | 61ms | 31048kb | C++14 | 3.9kb | 2024-06-20 21:48:32 | 2024-06-20 21:48:34 |
Judging History
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;
}
詳細信息
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%