QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#488182 | #8905. Ультра mex | PorNPtree | 0 | 1573ms | 69584kb | C++17 | 3.9kb | 2024-07-23 17:37:40 | 2024-07-23 17:37:41 |
Judging History
answer
#include <bits/stdc++.h>
using namespace std;
const int N = 16;
int P, G, iG, fac[(1 << N) + 5], iFac[(1 << N) + 5];
int f[N + 1][N + 1][1 << N], g[N + 1][N + 1][1 << N];
int ksm(int x, int y = P - 2) {
int res = 1;
while (y) {
if (y & 1) res = 1ll * res * x % P;
x = 1ll * x * x % P;
y >>= 1;
}
return res;
}
int C(int x, int y) {
return 1ll * fac[x] * iFac[y] % P * iFac[x - y] % P;
}
vector<int> arr;
void divide() {
int p = P - 1;
for (int i = 2; i * i <= p; ++i) {
if (!(p % i)) {
arr.push_back((P - 1) / i);
while (!(p % i)) p /= i;
}
}
if (p != 1) arr.push_back((P - 1) / p);
}
int chk(int g) {
for (auto x : arr) {
if (ksm(g, x) == 1) return 0;
}
return 1;
}
void NTTInit() {
divide();
G = 2;
while (!chk(G)) ++G;
iG = ksm(G);
}
int tr[1 << N];
void NTT(vector<int> &f, int type = 1) {
int n = f.size();
printf("%d\n", n);
for (int i = 1; i < n; ++i) tr[i] = (tr[i >> 1] >> 1) | ((i & 1) ? n >> 1 : 0);
for (int i = 0; i < n; ++i) if (i < tr[i]) swap(f[i], f[tr[i]]);
for (int len = 2; len <= n; len <<= 1) {
int p = len >> 1, buf = ksm(type ? G : iG, (P - 1) / len);
for (int i = 0; i < n; i += len) {
int now = 1;
for (int j = i; j < i + p; ++j) {
int tmp = 1ll * now * f[j + p] % P;
((f[j + p] = f[j] - tmp) < 0) && (f[j + p] += P);
((f[j] += tmp) >= P) && (f[j] -= P);
now = 1ll * now * buf % P;
}
}
}
if (!type) {
int iv = ksm(n);
for (int i = 0; i < n; ++i) {
f[i] = 1ll * f[i] * iv % P;
}
}
}
vector<int> operator * (vector<int> x, vector<int> y) {
int n = 1;
while (n < (int)x.size() + (int)y.size() - 1) n <<= 1;
x.resize(n), y.resize(n);
NTT(x), NTT(y);
for (int i = 0; i < n; ++i) x[i] = 1ll * x[i] * y[i] % P;
NTT(x, 0);
while (!x.empty() && !x.back()) x.pop_back();
return x;
}
void preCalc() {
NTTInit();
for (int i = fac[0] = iFac[0] = 1; i <= (1 << N); ++i) {
fac[i] = 1ll * fac[i - 1] * i % P;
iFac[i] = (i == 1 ? 1 : 1ll * (P - P / i) * iFac[P % i] % P);
}
for (int i = 1; i <= (1 << N); ++i) {
iFac[i] = 1ll * iFac[i - 1] * iFac[i] % P;
}
for (int o = 0; o < N; ++o) {
for (int i = 0; i <= (1 << o) - 1 - (!!o); ++i) {
f[o][o + 1][i + (1 << o)] = g[o][o + 1][i + (1 << o)] = C((1 << o) - 1 - (!!o), i);
}
for (int i = o + 2; i <= N; ++i) {
vector<int> F, G, H;
for (int j = 0; j < (1 << (i - 1)); ++j) F.push_back(f[o][i - 1][j]);
for (int j = 0; j <= (1 << (i - 1)); ++j) G.push_back(C(1 << (i - 1), j));
for (int j = 0; j <= (1 << (i - 1)) - 1; ++j) H.push_back(C((1 << (i - 1)) - 1, j));
vector<int> fg = F * G, fh = F * H;
for (int j = 0; j < (int)fg.size(); ++j) f[o][i][j] = (f[o][i][j] + fg[j]) % P;
for (int j = 0; j < (int)fh.size(); ++j) g[o][i][j] = (g[o][i][j] + fh[j]) % P;
for (int j = 1; j < (1 << (i - 1)); ++j) {
f[o][i][j + (1 << (i - 1))] = (0ll + f[o][i][j + (1 << (i - 1))] + f[o][i - 1][j] + g[o][i - 1][j]) % P;
g[o][i][j + (1 << (i - 1))] = (g[o][i][j + (1 << (i - 1))] + g[o][i - 1][j]) % P;
}
}
}
}
signed main() {
scanf("%d", &P);
preCalc();
int T; scanf("%d", &T);
while (T--) {
int k, n, p; scanf("%d%d%d", &k, &n, &p);
int z = 0;
while ((1 << z) < p) ++z;
if ((1 << z) != p) {
puts("0");
continue;
}
if (p == (1 << k) && n == (1 << k)) {
puts("1");
continue;
}
printf("%d\n", f[z][k][n]);
}
return 0;
}
Details
Tip: Click on the bar to expand more detailed information
Subtask #1:
score: 0
Wrong Answer
Test #1:
score: 0
Wrong Answer
time: 1573ms
memory: 69584kb
input:
118751233 10 1 2 2 1 2 1 1 2 2 1 2 2 1 2 2 1 1 1 1 1 2 1 1 1 1 1 1 1 1 2
output:
4 4 4 4 4 4 8 8 8 8 8 8 16 16 16 16 16 16 32 32 32 32 32 32 64 64 64 64 64 64 128 128 128 128 128 128 256 256 256 256 256 256 512 512 512 512 512 512 1024 1024 1024 1024 1024 1024 2048 2048 2048 2048 2048 2048 4096 4096 4096 4096 4096 4096 8192 8192 8192 8192 8192 8192 16384 16384 16384 16384 16384 ...
result:
wrong answer 1st numbers differ - expected: '1', found: '4'
Subtask #2:
score: 0
Skipped
Dependency #1:
0%
Subtask #3:
score: 0
Skipped
Dependency #1:
0%
Subtask #4:
score: 0
Skipped
Dependency #1:
0%
Subtask #5:
score: 0
Skipped
Dependency #1:
0%
Subtask #6:
score: 0
Skipped
Dependency #1:
0%
Subtask #7:
score: 0
Skipped
Dependency #1:
0%
Subtask #8:
score: 0
Skipped
Dependency #1:
0%
Subtask #9:
score: 0
Skipped
Dependency #1:
0%
Subtask #10:
score: 0
Skipped
Dependency #1:
0%
Subtask #11:
score: 0
Skipped
Dependency #1:
0%
Subtask #12:
score: 0
Skipped
Dependency #1:
0%
Subtask #13:
score: 0
Skipped
Dependency #1:
0%
Subtask #14:
score: 0
Skipped
Dependency #1:
0%
Subtask #15:
score: 0
Skipped
Dependency #1:
0%
Subtask #16:
score: 0
Skipped
Dependency #1:
0%
Subtask #17:
score: 0
Skipped
Dependency #1:
0%
Subtask #18:
score: 0
Skipped
Dependency #1:
0%
Subtask #19:
score: 0
Skipped
Dependency #1:
0%
Subtask #20:
score: 0
Skipped
Dependency #1:
0%
Subtask #21:
score: 0
Skipped
Dependency #1:
0%
Subtask #22:
score: 0
Skipped
Dependency #1:
0%
Subtask #23:
score: 0
Skipped
Dependency #1:
0%
Subtask #24:
score: 0
Skipped
Dependency #1:
0%
Subtask #25:
score: 0
Skipped
Dependency #1:
0%
Subtask #26:
score: 0
Skipped
Dependency #1:
0%
Subtask #27:
score: 0
Skipped
Dependency #1:
0%
Subtask #28:
score: 0
Skipped
Dependency #1:
0%
Subtask #29:
score: 0
Skipped
Dependency #1:
0%
Subtask #30:
score: 0
Skipped
Dependency #1:
0%