QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#488182#8905. Ультра mexPorNPtree0 1573ms69584kbC++173.9kb2024-07-23 17:37:402024-07-23 17:37:41

Judging History

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

  • [2024-07-23 17:37:41]
  • 评测
  • 测评结果:0
  • 用时:1573ms
  • 内存:69584kb
  • [2024-07-23 17:37:40]
  • 提交

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;
}

详细

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%