列表

详情


NC21609. 生成树计数

描述

牛牛最近正在学生成树计数,他碰到下面这样一个题
有n个点,现在连接了n-3条边,没有自环和重边,现在需要再连接两条边形成一棵生成树,求生成树的方案数对987,654,323取模

输入描述

第一行先输入一个整数n (4 ≤ ≤ 1000)
第二行输入n-3个整数x[i] (1 ≤ x[i] ≤ n - 1)
第三行输入n-3个整数y[i] (2 ≤ y[i] ≤ n)
(x[i] < y[i])

输出描述

输出一个整数

示例1

输入:

4
1
2

输出:

8

示例2

输入:

4
3
4

输出:

8

示例3

输入:

5
1 2
2 3

输出:

15

示例4

输入:

6
1 1 2
2 3 3

输出:

0

示例5

输入:

5
1 2
4 5

输出:

20

示例6

输入:

6
1 3 5
2 4 6

输出:

48

示例7

输入:

10
1 2 3 4 5 6 7	
2 4 6 7 8 9 10

输出:

300

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++11(clang++ 3.9) 解法, 执行用时: 10ms, 内存消耗: 412K, 提交时间: 2020-10-02 20:24:31

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define f(i,a,b) for(int i=a;i<=b;i++)
inline ll r() {
	ll x=0,f=1;
	char c=getchar();
	while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
	while(isdigit(c))x=x*10+c-'0',c=getchar();
	return x*f;
}
#define d r()
ll n;
ll fa[1010];
ll x[1010];
ll find(ll x){
	if(fa[x]==x)return x;
	else return fa[x]=find(fa[x]);
}
ll a[1010];
ll ans,cmp;
int main(){
	n=ans=d;
	f(i,1,n)fa[i]=i;
	f(i,1,n-3)x[i]=d;
	f(i,1,n-3){
		ll y=d;
		ll xx=find(x[i]),yy=find(y);
		if(xx!=yy)fa[xx]=yy;
	}
	f(i,1,n)a[find(i)]++;
	f(i,1,n)if(a[i])ans*=a[i],ans%=987654323,cmp++;
	if(cmp!=3)ans=0;
	printf("%lld",ans);
	return 0;
}

上一题