比赛 |
20250904开学热身赛 |
评测结果 |
AAAAAAAAAA |
题目名称 |
苹果树 |
最终得分 |
100 |
用户昵称 |
xuyuqing |
运行时间 |
1.531 s |
代码语言 |
C++ |
内存使用 |
13.44 MiB |
提交时间 |
2025-09-04 21:43:00 |
显示代码纯文本
#include <cstdio>
#include <iostream>
using namespace std;
long long n;
long long p;
long long sum[2025] = {0, 0, 2};
long long frac[2025] = {1, 1, 2};
long long deps[2025] = {0, 0, 2};
long long choose[2025][2025];
int main () {
freopen ("2018tree.in", "r", stdin);
freopen ("2018tree.out", "w", stdout);
cin >> n >> p;
choose[1][0] = 1;
choose[1][1] = 1;
for (int i = 2; i <= n; i++) {
choose[i][0] = 1;
for (int j = 1; j <= n; j++) {
choose[i][j] = choose[i - 1][j - 1] + choose[i - 1][j];
choose[i][j] %= p;
}
}
for (int i = 3; i <= n; i++) {
frac[i] = frac[i - 1] * i % p;
for (int left = 0; left <= i - 1; left++) {
int right = i - 1 - left;
long long cc = 0;
cc += sum[left] * frac[right] % p;
cc %= p;
cc += sum[right] * frac[left] % p;
cc %= p;
cc += (deps[left] + frac[left] * left % p) % p * frac[right] % p * (right + 1) % p;
cc %= p;
cc += (deps[right] + frac[right] * right % p) % p * frac[left] % p * (left + 1) % p;
cc %= p;
sum[i] += cc * choose[i - 1][left] % p;
sum[i] %= p;
long long dd = 0;
dd += (deps[left] + frac[left] * left % p) % p * frac[right] % p;
dd %= p;
dd += (deps[right] + frac[right] * right % p) % p * frac[left] % p;
dd %= p;
deps[i] += dd * choose[i - 1][left] % p;
deps[i] %= p;
}
}
cout << sum[n] % p << endl;
return 0;
}