UVa 12034 - Race

12034 - Race

時間限制:1.000秒

題目鏈接:uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=3185


      這算是排列組合吧,然後遞推……

      題目第一行輸入一個數字T,代表T組數據。

      接下來T行每行輸入一個數字n(1 ≤ n≤ 1000)。

      要求算出n匹馬比賽可能出現的所有情況的數量。例如n == 2時,最終名次有三種可能:並列第一,A第一,B第一。數量對10056取餘。

      劉汝佳《算法競賽入門經典(第二版)》已提供思路:

            設答案爲f(n),設第一名有i個人,則有C(n, i)種可能性,接下來有f(n - i)種可能性,因此答案爲ΣC(n, i)*f(n - i)。

      這裏的C(n, i)代表組合數,公式爲C(n, i) = n! / ( k! * (n - k)! ),但是直接算階乘到21就會直接超出unsigned long long的上限,所以這裏用了遞推的辦法:

memset(C, 0, sizeof(C));
for(int i = 0; i <= 1000; ++i) {
    C[i][0] = 1;
    for(int j = 1; j <= i; ++j) C[i][j] = (C[i - 1][j - 1] + C[i - 1][j]) % 10056; // 按題意對10056取餘
}

      因爲n ≤ 1000,所以很適合打表啊……

      看到K神是程序開始前提前算一遍把結果存起來到時候直接查……我是直接用程序跑出了代碼……好吧我猥瑣了點……


打表的程序:

#include 
#include 
#include 
#include 

using namespace std;

int C[1010][1010];
int f[1010];

inline void Prepare_C() {
    memset(C, 0, sizeof(C));
    for(int i = 0; i <= 1000; ++i) {
        C[i][0] = 1;
        for(int j = 1; j <= i; ++j) C[i][j] = (C[i - 1][j - 1] + C[i - 1][j]) % 10056;
    }
}
inline void Prepare_f() {
    f[0] = f[1] = 1;
    for(int n = 2; n <= 1000; ++n) {
        long long res = 0;
        for(int i = 1; i <= n; ++i) {
            res += C[n][i] * f[n - i];
            res %= 10056;
        }
        f[n] = res;
    }
}

int main() {
    freopen("打表.txt", "w", stdout);
    Prepare_C();
    Prepare_f();
    cout << "int res[] = {1";
    for(int i = 1; i <= 1000; ++i) {
        cout << ", " << f[i];
    }
    cout << "};" << endl;
}

提交的代碼:

#include 

int res[] = {1, 1, 3, 13, 75, 541, 4683, 7069, 2811, 7837, 8211, 6469, 867, 1909, 3963, 3061, 7683, 3253, 2643, 9805, 7467, 10021, 9699, 3157, 6915, 9133, 1827, 7093, 939, 5341, 8619, 2317, 4443, 7813, 10035, 9541, 6579, 349, 7323, 6469, 7467, 5413, 9027, 3421, 8955, 8125, 4731, 877, 7875, 6493, 1875, 9205, 4971, 2413, 1563, 1597, 1179, 9853, 1539, 1381, 531, 301, 1779, 5989, 7707, 1909, 8235, 541, 5379, 9421, 147, 3877, 5667, 4405, 1971, 277, 1347, 9301, 4131, 7165, 7995, 8509, 2331, 4165, 6867, 6829, 3531, 3013, 8163, 3661, 5955, 4957, 2667, 2365, 9147, 8557, 1203, 6493, 9435, 8005, 10011, 1549, 3603, 2317, 1467, 9781, 915, 8053, 1539, 5941, 9555, 5749, 7131, 4117, 3435, 2845, 579, 733, 7707, 4789, 195, 7525, 6555, 3565, 5811, 469, 6987, 4669, 10011, 9853, 4131, 8677, 411, 5701, 6219, 7741, 6651, 7693, 123, 8557, 8211, 9685, 507, 6829, 6147, 9877, 7059, 9877, 9459, 7141, 3795, 2941, 8787, 5941, 2019, 1021, 7755, 7093, 7131, 1693, 4275, 469, 387, 2773, 2019, 5221, 7155, 9781, 8187, 7813, 9963, 4645, 1587, 7405, 8667, 1405, 2715, 4573, 7971, 2869, 1635, 4981, 5067, 8173, 435, 8077, 387, 7741, 7803, 8413, 1899, 805, 9963, 1189, 2115, 205, 1107, 613, 6267, 7237, 1299, 4141, 7563, 853, 3915, 3301, 7179, 3349, 8427, 5701, 9483, 6685, 891, 4621, 7731, 5149, 9747, 5029, 4059, 8701, 651, 7813, 5715, 5293, 2331, 2101, 5163, 5389, 7083, 7909, 4251, 13, 9147, 9469, 8499, 3157, 7419, 3901, 483, 5533, 7755, 4837, 2283, 5533, 3963, 7165, 2043, 8125, 8019, 1069, 3459, 6493, 4371, 1573, 3171, 253, 243, 5533, 339, 9013, 8091, 5197, 3915, 4501, 1683, 9541, 9099, 9013, 4251, 4309, 7299, 8917, 963, 9853, 6723, 4357, 2643, 4285, 3579, 8845, 8691, 6685, 3291, 8677, 9243, 3565, 8115, 5845, 2283, 3493, 9819, 8461, 6387, 7093, 4083, 2725, 627, 7645, 339, 8581, 9483, 4357, 2331, 5773, 747, 9637, 9939, 2629, 1683, 3973, 7323, 5533, 1899, 4909, 9723, 7309, 4755, 6277, 1707, 6373, 1011, 2533, 4179, 9589, 7971, 5605, 7035, 8173, 3555, 4309, 7347, 4357, 1035, 9181, 7059, 7285, 99, 6109, 7683, 9325, 6435, 2581, 1203, 6253, 5115, 3037, 435, 9493, 2595, 4189, 4347, 7765, 5043, 4261, 6099, 7405, 6339, 4501, 8091, 4189, 8211, 8845, 3507, 2845, 8595, 1213, 10011, 877, 9651, 1501, 3459, 3949, 3075, 6469, 8763, 4645, 8091, 133, 3291, 9469, 867, 4837, 7251, 61, 5859, 3829, 9243, 781, 5667, 8269, 2451, 2101, 5163, 8029, 339, 4477, 8739, 2533, 6555, 517, 339, 3949, 2595, 5581, 1131, 6109, 2955, 7213, 3267, 4573, 6219, 9349, 4659, 2077, 1419, 3493, 6003, 2413, 3771, 5029, 3, 13, 75, 541, 4683, 7069, 2811, 7837, 8211, 6469, 867, 1909, 3963, 3061, 7683, 3253, 2643, 9805, 7467, 10021, 9699, 3157, 6915, 9133, 1827, 7093, 939, 5341, 8619, 2317, 4443, 7813, 10035, 9541, 6579, 349, 7323, 6469, 7467, 5413, 9027, 3421, 8955, 8125, 4731, 877, 7875, 6493, 1875, 9205, 4971, 2413, 1563, 1597, 1179, 9853, 1539, 1381, 531, 301, 1779, 5989, 7707, 1909, 8235, 541, 5379, 9421, 147, 3877, 5667, 4405, 1971, 277, 1347, 9301, 4131, 7165, 7995, 8509, 2331, 4165, 6867, 6829, 3531, 3013, 8163, 3661, 5955, 4957, 2667, 2365, 9147, 8557, 1203, 6493, 9435, 8005, 10011, 1549, 3603, 2317, 1467, 9781, 915, 8053, 1539, 5941, 9555, 5749, 7131, 4117, 3435, 2845, 579, 733, 7707, 4789, 195, 7525, 6555, 3565, 5811, 469, 6987, 4669, 10011, 9853, 4131, 8677, 411, 5701, 6219, 7741, 6651, 7693, 123, 8557, 8211, 9685, 507, 6829, 6147, 9877, 7059, 9877, 9459, 7141, 3795, 2941, 8787, 5941, 2019, 1021, 7755, 7093, 7131, 1693, 4275, 469, 387, 2773, 2019, 5221, 7155, 9781, 8187, 7813, 9963, 4645, 1587, 7405, 8667, 1405, 2715, 4573, 7971, 2869, 1635, 4981, 5067, 8173, 435, 8077, 387, 7741, 7803, 8413, 1899, 805, 9963, 1189, 2115, 205, 1107, 613, 6267, 7237, 1299, 4141, 7563, 853, 3915, 3301, 7179, 3349, 8427, 5701, 9483, 6685, 891, 4621, 7731, 5149, 9747, 5029, 4059, 8701, 651, 7813, 5715, 5293, 2331, 2101, 5163, 5389, 7083, 7909, 4251, 13, 9147, 9469, 8499, 3157, 7419, 3901, 483, 5533, 7755, 4837, 2283, 5533, 3963, 7165, 2043, 8125, 8019, 1069, 3459, 6493, 4371, 1573, 3171, 253, 243, 5533, 339, 9013, 8091, 5197, 3915, 4501, 1683, 9541, 9099, 9013, 4251, 4309, 7299, 8917, 963, 9853, 6723, 4357, 2643, 4285, 3579, 8845, 8691, 6685, 3291, 8677, 9243, 3565, 8115, 5845, 2283, 3493, 9819, 8461, 6387, 7093, 4083, 2725, 627, 7645, 339, 8581, 9483, 4357, 2331, 5773, 747, 9637, 9939, 2629, 1683, 3973, 7323, 5533, 1899, 4909, 9723, 7309, 4755, 6277, 1707, 6373, 1011, 2533, 4179, 9589, 7971, 5605, 7035, 8173, 3555, 4309, 7347, 4357, 1035, 9181, 7059, 7285, 99, 6109, 7683, 9325, 6435, 2581, 1203, 6253, 5115, 3037, 435, 9493, 2595, 4189, 4347, 7765, 5043, 4261, 6099, 7405, 6339, 4501, 8091, 4189, 8211, 8845, 3507, 2845, 8595, 1213, 10011, 877, 9651, 1501, 3459, 3949, 3075, 6469, 8763, 4645, 8091, 133, 3291, 9469, 867, 4837, 7251, 61, 5859, 3829, 9243, 781, 5667, 8269, 2451, 2101, 5163, 8029, 339, 4477, 8739, 2533, 6555, 517, 339, 3949, 2595, 5581, 1131, 6109, 2955, 7213, 3267, 4573, 6219, 9349, 4659, 2077, 1419, 3493, 6003, 2413, 3771, 5029, 3, 13, 75, 541, 4683, 7069, 2811, 7837, 8211, 6469, 867, 1909, 3963, 3061, 7683, 3253, 2643, 9805, 7467, 10021, 9699, 3157, 6915, 9133, 1827, 7093, 939, 5341, 8619, 2317, 4443, 7813, 10035, 9541, 6579, 349, 7323, 6469, 7467, 5413, 9027, 3421, 8955, 8125, 4731, 877, 7875, 6493, 1875, 9205, 4971, 2413, 1563, 1597, 1179, 9853, 1539, 1381, 531, 301, 1779, 5989, 7707, 1909, 8235, 541, 5379, 9421, 147, 3877, 5667, 4405, 1971, 277, 1347, 9301, 4131, 7165, 7995, 8509, 2331, 4165, 6867, 6829, 3531, 3013, 8163, 3661, 5955, 4957, 2667, 2365, 9147, 8557, 1203, 6493, 9435, 8005, 10011, 1549, 3603, 2317, 1467, 9781, 915, 8053, 1539, 5941, 9555, 5749, 7131, 4117, 3435, 2845, 579, 733, 7707, 4789, 195, 7525, 6555, 3565, 5811, 469, 6987, 4669, 10011, 9853, 4131, 8677, 411, 5701, 6219, 7741, 6651, 7693, 123, 8557, 8211, 9685, 507, 6829, 6147, 9877, 7059, 9877, 9459, 7141, 3795, 2941, 8787, 5941, 2019, 1021, 7755, 7093, 7131, 1693, 4275, 469, 387, 2773, 2019};
int T, n, k;


int main() {
    scanf("%d", &T);
    for(k = 1; k <= T; ++k) {
        scanf("%d", &n);
        printf("Case %d: %d\n", k, res[n]);
    }
}



發佈了35 篇原創文章 · 獲贊 21 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章