比赛 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;
}