【GDKOI2005】建立航道

这篇博客探讨了在宇宙星系中建立超光速航道的数学优化问题。科学家们面临挑战,每个星球最多能与3个其他星球直接连接,而目标是最小化航道数量。文章介绍了如何应用Prüfer序列来解决这个问题,并提供了一个C++程序实例,该程序计算了给定星球数量下的方案总数。对于大型数据,程序能够计算结果对10001取模后的值,确保了计算效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Description
公元XXXX年,XX系的n个星球即将结盟,联盟决定在星球之间建立若干条超光速运输航道,以便使任两个星球间都可以直接或间接通过超光速航道快速运输货物。联盟希望建立尽量少的航道,因为这种航道造价极其昂贵。科学家们以证实这n个星球任两个之间都可建航道,而且每条航道创建的费用近似一样,但一个星球最多只能跟3个星球直接相连。
你的任务是求出满足要求的总方案数,这个数可能很大,你只要求出方案数mod 10001的值就行了。

Input
只有一个整数n(1<=n<=200),表示星球数。

Output
输出一个整数,为满足要求的方案总数对10001求余后的结果。

Sample Input
5

Sample Output
120

重点在于prufer序列的应用

在这里插入图片描述
在这里插入图片描述

#include<cstdio>
using namespace std;
const int N=201;
const int mod=10001;
int n,f[N];
int main() {
	scanf("%d",&n);
	f[0]=1;
	for(int i=1;i<=n;i++) {
		for(int j=n-2;j>=1;j--) {
		 	f[j]+=f[j-1]*j;
		 	if(j>1) f[j]+=f[j-2]*j*(j-1)/2;
		 	f[j]%=mod;
		}
	}
	if(n==1) printf("1");
	else printf("%d",f[n-2]);
}

醉卧沙场君莫笑,古来征战几人回

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值