目录
#include<bits/stdc++.h>
using namespace std;
using ll = long long;

const int N = 505;
int n;
ll mod;
ll c[N][N], pw2[N], pwc[N], pwp[N][N];
ll f1[N][N], l1[N][N], w1[N][N];
ll f2[N][N], l2[N][N], w2[N][N];
ll cc[N], td[N];

int main() {
    ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    cin >> n >> mod;

    for (int i = 0; i < N; ++i) {
        c[i][0] = 1;
        for (int j = 1; j <= i; ++j) {
            c[i][j] = (c[i - 1][j - 1] + c[i - 1][j]) % mod;
        }
    }

    pw2[0] = 1;
    for (int i = 1; i < N; ++i) pw2[i] = pw2[i - 1] * 2 % mod;

    for (int i = 0; i < N; ++i) {
        pwc[i] = 1;
        ll exp = 1LL * i * (i - 1) / 2;
        ll bas = 2, res = 1;
        while (exp) {
            if (exp & 1) res = res * bas % mod;
            bas = bas * bas % mod;
            exp >>= 1;
        }
        pwc[i] = res;

        ll sub = (pw2[i] - 1 + mod) % mod;
        pwp[i][0] = 1;
        for (int j = 1; j < N; ++j) {
            pwp[i][j] = pwp[i][j - 1] * sub % mod;
        }
    }

    f1[1][1] = 1; l1[1][1] = 1; w1[1][1] = 0;
    for (int i = 1; i < n; ++i) {
        for (int j = 1; j <= i; ++j) {
            if (!f1[i][j]) continue;
            for (int k = 1; i + k <= n; ++k) {
                ll wys = c[i + k - 1][k] * pwp[j][k] % mod * pwc[k] % mod;
                f1[i + k][k] = (f1[i + k][k] + f1[i][j] * wys) % mod;
                ll wad = ((w1[i][j] + k * l1[i][j]) % mod) * wys % mod;
                w1[i + k][k] = (w1[i + k][k] + wad) % mod;
                ll lad = ((l1[i][j] + f1[i][j]) % mod) * wys % mod;
                l1[i + k][k] = (l1[i + k][k] + lad) % mod;
            }
        }
    }

    f2[2][2] = 2; l2[2][2] = 2; w2[2][2] = 0;
    for (int i = 2; i < n; ++i) {
        for (int j = 1; j <= i; ++j) {
            if (!f2[i][j]) continue;
            for (int k = 1; i + k <= n; ++k) {
                ll wys = c[i + k - 2][k] * pwp[j][k] % mod * pwc[k] % mod;
                f2[i + k][k] = (f2[i + k][k] + f2[i][j] * wys) % mod;
                ll wad = ((w2[i][j] + k * l2[i][j]) % mod) * wys % mod;
                w2[i + k][k] = (w2[i + k][k] + wad) % mod;
                ll lad = ((l2[i][j] + f2[i][j]) % mod) * wys % mod;
                l2[i + k][k] = (l2[i + k][k] + lad) % mod;
            }
        }
    }

    for (int i = 1; i <= n; ++i) {
        for (int j = 1; j <= i; ++j) {
            cc[i] = (cc[i] + f1[i][j]) % mod;
            td[i] = (td[i] + w1[i][j]) % mod;
        }
    }

    ll wa2 = 0;
    for (int j = 1; j <= n; ++j) wa2 = (wa2 + w2[n][j]) % mod;

    ll wds = 0;
    for (int k = 1; k <= n - 1; ++k) {
        ll tm1 = td[k] * cc[n - k] % mod;
        ll tm2 = cc[k] * td[n - k] % mod;
        ll trm = (tm1 + tm2) % mod;
        wds = (wds + c[n - 2][k - 1] * trm) % mod;
    }

    ll wta = (wa2 - wds + mod) % mod;
    ll ans = (2 * td[n] - 2 * wta) % mod;
    ans = (ans % mod + mod) % mod;

    cout << ans << "\n";
    return 0;
}

0 条评论

目前还没有评论...