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