bzoj1430

这道题只是给bzoj1005做一个铺垫
这里介绍了一个叫prufer编码的东西,就是
给定一棵带标号的无根树,找出编号最小的叶子节点,写下与它相邻的节点的编号,
然后删掉这个叶子节点。反复执行这个操作直到只剩两个节点为止。
这个编码有几个重要的性质
1. 每棵树都唯一对应一个prufer编码
2. 每一个prufer编码都唯一对应一棵树
3. 树上每个点的度数-1=这个点在数列出现的次数
所以用这个解决完全图生成树个数就很显然了,答案是n^(n-2)

 1 const mo=9999991;
 2 var c:array[0..100] of longint;
 3     i,j,p,b:longint;
 4     ans,n:int64;
 5 
 6 begin
 7   readln(n);
 8   j:=0;
 9   b:=n-2;
10   while b<>0 do
11   begin
12     inc(j);
13     c[j]:=b mod 2;
14     b:=b div 2;
15   end;
16   ans:=1;
17   for i:=j downto 1 do
18   begin
19     ans:=sqr(ans) mod mo;
20     if c[i]=1 then ans:=ans*int64(n) mod mo;
21   end;
22   for i:=1 to n-1 do
23     ans:=ans*int64(i) mod mo;
24   writeln(ans);
25 end.
26 
27  
View Code
原文地址:https://www.cnblogs.com/phile/p/4473067.html