1212. 建立航道
Constraints
Time Limit: 1 secs, Memory Limit: 32 MB
Description
公元XXXX年,XX系的n个星球即将结盟,联盟决定在星球间建立若干条超光速运输航道,以便使任两个星球间都可以直接或间接通过超光速航道快速运输货物。联盟希望建立尽量少的航道,因为这种航道造价极其昂贵。科学家们已证实这n个星球中任两个之间都可以建航道,而且每条航道创建的费用近似一样,但一个星球最多只能跟3个星球直接相连。
你的任务是求出满足要求的总的方案数,这个数可能很大,你只要求出末4位数字就可以了。
Input
只有一个整数n(1<=n<=200),表示星球数。
Output
输出一个整数,为满足要求的方案总数对10^4求余后的结果。
Sample Input
5
Sample Output
120
Problem Source
ZSUACM Team Member
// Problem#: 1212
// Submission#: 3585888
// The source code is licensed under Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License
// URI: http://creativecommons.org/licenses/by-nc-sa/3.0/
// All Copyright reserved by Informatic Lab of Sun Yat-sen University
#include <stdio.h>
#include <string.h>
#define maxn 200
#define modulo 10000
long n, f[maxn + 1], r[maxn + 1], C[maxn + 1][maxn + 1];
void process() {
long i, j, k;
C[0][0] = 1;
for (i = 1; i <= maxn; i++) {
C[i][0] = C[i][i] = 1;
for (j = 1; j <= i - 1; j++) {
C[i][j] = (C[i - 1][j] + C[i - 1][j - 1]) % modulo;
}
}
f[0] = f[1] = f[2] = 1;
r[0] = r[1] = r[2] = 1;
f[3] = 3;
r[3] = 3;
for (n = 4; n <= maxn; n++) {
r[n] = (r[n - 1] * (n - 1)) % modulo;
for (i = 1; i <= n - 2; i++) {
r[n] += ((C[n - 2][i - 1] * ((r[i] * i) % modulo)) % modulo) * ((r[n - 1 - i] * (n - 1 - i)) % modulo);
r[n] %= modulo;
}
f[n] = r[n];
for (i = 1; i <= n - 3; i++) {
for (j = 1; j <= n - 1 - i - 1; j++) {
f[n] += (((C[n - 2][i - 1] * C[n - 1 - i - 1][j - 1])) % modulo) * ((((((r[i] * i) % modulo) * ((r[j] * j) % modulo)) % modulo) * ((r[n - 1 - i - j] * (n - 1 - i - j)) % modulo)) % modulo);
f[n] %= modulo;
}
}
}
}
int main() {
process();
scanf("%ld", &n);
printf("%ld\n", f[n]);
return 0;
}