QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#488177#8905. Ультра mexPorNPtree0 0ms0kbC++173.9kb2024-07-23 17:28:502024-07-23 17:28:51

Judging History

This is the latest submission verdict.

  • [2024-07-23 17:28:51]
  • Judged
  • Verdict: 0
  • Time: 0ms
  • Memory: 0kb
  • [2024-07-23 17:28:50]
  • Submitted

answer

#include <bits/stdc++.h>

using namespace std;

const int N = 17;

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();
    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
Time Limit Exceeded

Test #1:

score: 0
Time Limit Exceeded

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:


result:


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%