1. 程式人生 > >[bzo1211][HNOI2004]樹的計數_prufer序列

[bzo1211][HNOI2004]樹的計數_prufer序列

樹的計數 bzoj-1211 HNOI-2004

題目大意題目連結

註釋:略。


想法

prufer序列有一個性質就是一個數在prufer序列中出現的次數等於這個prufer序列生成的樹中它的度數-1。

故此我們就是要求$C_{n-2}^{d_1-1}\times C_{n-2-d_1+1}^{d_2-1}\times \cdots \times C_{d_n-1}^{d_n-1}$。

隨便搞搞就行了。

Code:

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define M 160
using namespace std;
typedef long long ll;
int n,sum,d[M];
int cnt[M];
ll ans=1;
ll Quick_Power(ll x,int y)
{
	ll re=1;
	while(y)
	{
		if(y&1)re*=x;
		x*=x;
		y>>=1;
	}
	return re;
}
void Decomposition(int x,int flag)
{
	int i;
	for(i=2;i*i<=x;i++)
		while(x%i==0)
			cnt[i]+=flag,x/=i;
	if(x^1)
		cnt[x]+=flag;
}
int main()
{
	int i,j;
	cin>>n;
	for(i=2;i<=n-2;i++)
		Decomposition(i,1);
	for(i=1;i<=n;i++)
	{
		scanf("%d",&d[i]);
		if(!d[i]&&n!=1)
		{
			puts("0");
			return 0;
		}
		sum+=d[i]-1;
		for(j=2;j<=d[i]-1;j++)
			Decomposition(j,-1);
	}
	if(sum!=n-2)
	{
		puts("0");
		return 0;
	}
	for(i=1;i<=n-2;i++)
		if(cnt[i])
			ans*=Quick_Power(i,cnt[i]);
	cout<<ans<<endl;
}

小結:prufer序列好像只有裸題誒.....