QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#449302 | #7838. 往日之影 | Made_in_Code | 40 | 63ms | 42776kb | C++14 | 3.9kb | 2024-06-20 21:54:00 | 2024-06-20 21:54:01 |
Judging History
answer
#include <iostream>
#define LL long long
using namespace std;
const int kMaxN = 1e6 + 1, kMaxL = 20;
struct H {
int pw;
LL 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: 28ms
memory: 42640kb
input:
1 998244353 3 1 1 0 1
output:
0
result:
ok single line: '0'
Test #2:
score: 0
Accepted
time: 28ms
memory: 42692kb
input:
1 998244353 7 0 2 1 4
output:
998069185
result:
ok single line: '998069185'
Test #3:
score: 0
Accepted
time: 35ms
memory: 42768kb
input:
1 998244353 4 0 1 0 3
output:
0
result:
ok single line: '0'
Test #4:
score: 0
Accepted
time: 26ms
memory: 42704kb
input:
1 998244353 2 1 0 1 0
output:
0
result:
ok single line: '0'
Test #5:
score: 0
Accepted
time: 25ms
memory: 42692kb
input:
1 998244353 6 2 1 0 3
output:
997696001
result:
ok single line: '997696001'
Test #6:
score: 0
Accepted
time: 32ms
memory: 42724kb
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: 32ms
memory: 42772kb
input:
1 998244353 40 11 9 9 11
output:
855684614
result:
ok single line: '855684614'
Test #8:
score: 0
Accepted
time: 32ms
memory: 42696kb
input:
1 998244353 39 12 8 7 12
output:
629648158
result:
ok single line: '629648158'
Test #9:
score: 0
Accepted
time: 24ms
memory: 42700kb
input:
1 998244353 38 13 8 9 8
output:
944107686
result:
ok single line: '944107686'
Test #10:
score: 0
Accepted
time: 40ms
memory: 42696kb
input:
1 998244353 37 16 7 7 7
output:
393700837
result:
ok single line: '393700837'
Test #11:
score: 0
Accepted
time: 36ms
memory: 42772kb
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: 32ms
memory: 42776kb
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: 37ms
memory: 42648kb
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: 28ms
memory: 42696kb
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: 32ms
memory: 42696kb
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: 29ms
memory: 42764kb
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: 22ms
memory: 42640kb
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: 32ms
memory: 42704kb
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: 28ms
memory: 42776kb
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: 42696kb
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: 33ms
memory: 42696kb
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: 31ms
memory: 42700kb
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: 63ms
memory: 42716kb
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: 31ms
memory: 42756kb
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%