1. 程式人生 > >NYOJ:星際之門(一)(cayley定理)

NYOJ:星際之門(一)(cayley定理)

http://acm.nyist.edu.cn/JudgeOnline/problem.php?pid=127

描述

公元3000年,子虛帝國統領著N個星系,原先它們是靠近光束飛船來進行旅行的,近來,X博士發明了星際之門,它利用蟲洞技術,一條蟲洞可以連通任意的兩個星系,使人們不必再待待便可立刻到達目的地。

帝國皇帝認為這種發明很給力,決定用星際之門把自己統治的各個星系連結在一起。

可以證明,修建N-1條蟲洞就可以把這N個星系連結起來。

現在,問題來了,皇帝想知道有多少種修建方案可以把這N個星系用N-1條蟲洞連結起來?

 

輸入

第一行輸入一個整數T,表示測試資料的組數(T<=100)
每組測試資料只有一行,該行只有一個整數N,表示有N個星系。(2<=N<=1000000)

輸出

對於每組測試資料輸出一個整數,表示滿足題意的修建的方案的個數。輸出結果可能很大,請輸出修建方案數對10003取餘之後的結果。

樣例輸入

2
3
4

樣例輸出

3
16

 

應用

組合數學中的應用

定理的另一種表述

過n個有標誌頂點的的數目等於n^(n-2)。 [3] 

定理的理解

此定理說明用n-1條邊將n個一致的頂點連線起來的連通圖的個數為n^(n-2),也可以這樣理解,將n個城市連線起來的樹狀公路網路有n^(n-2)種方案。所謂樹狀,指的是用n-1條邊將n個頂點構成一個連通圖。當然,建造一個樹狀的公路網路將n個城市連線起來,應求其中長度最短、造價最省的一種,或效益最大的一種。Cayley定理只是說明可能方案的數目。

 

#include<stdio.h>
int main()
{
	int n,i,t,sum;
	scanf("%d",&t);
	while(t--)
	{
		scanf("%d",&n);
		sum=1;
		for(i=0;i<n-2;i++)
			sum=(sum*n)%10003;
		printf("%d\n",sum);
	}
	return 0;
}