星際之門(cayley 定理)

星際之門(一)

時間限制:3000 ms  |  內存限制:65535 KB
難度:3
 
描述

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

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

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

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

 

 
輸入
第一行輸入一個整數T,表示測試數據的組數(T<=100)
每組測試數據只有一行,該行只有一個整數N,表示有N個星系。(2<=N<=1000000)
輸出
對於每組測試數據輸出一個整數,表示滿足題意的修建的方案的個數。輸出結果可能很大,請輸出修建方案數對10003取餘之後的結果。
樣例輸入
2
3
4
樣例輸出
3
16

 

     思路:

     cayley 定理。

     http://baike.baidu.com/view/10474884.htm?fr=aladdin 

     prufer 數列是無根樹的一個序列,結點數爲 n 的數可以轉化成一個 n - 2 的數列,且數列中的每一項都可以由 1 ~ n 中任意一個數構成。所以共有 n ^ ( n - 2 ) 種生成樹的可能。也是 cayley 的運用。

     http://baike.baidu.com/view/10308616.htm?fr=aladdin

 

     AC:

#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;

const int MOD = 10003;

int solve (int n) {
    if (n == 2) return 1;

    int ans = 1;
    for (int i = 1; i <= n - 2; ++i) {
        ans *= (n % MOD);
        ans %= MOD;
    }

    return ans;
}

int main() {

    int t;
    scanf("%d", &t);

    while (t--) {
        int n;
        scanf("%d", &n);

        printf("%d\n", solve(n));
    }

    return 0;
}

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章