目录
- 思路答疑
小羊杯3 C
- @ 2026-3-19 20:42:04
#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 条评论
目前还没有评论...
京公网安备11010802045784号
YIZHIYANG 一只羊 LV 8