QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#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;
}

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%