LightOJ-1005-Rooks [組合數學]


題目傳送門


題意:N*N的棋盤放K個車,一個車所在的行列不能有第二個車,求有多少种放法。

思路:簡單組合數學,如果K>N則不可能放下。K<=N有C(N,K)*C(N,K)*K!表示從N行中選K行,從N列中選K列,然後全排列。

#include <bits/stdc++.h>

using namespace std;

long long C[40][40];
void init ()
{
    for (int i = 1; i <= 31; i++)
    {
        for (int j = 1; j <= i; j++)
        {
            if (i==1 || i==j)
                C[i][j] = 1;
            else
                C[i][j] = C[i-1][j] + C[i-1][j-1];
        }
    }
}
int main(void)
{
    int T, cas=1;
    scanf("%d", &T);
    init();
    while (T--)
    {
        int n, k;
        long long ans = 0;
        scanf("%d %d", &n, &k);
        if (k<=n)
        {
            ans = C[n+1][k+1]*C[n+1][k+1];
            for (long long i = 1; i <= k; i++)
                ans*=i;
        }
        printf("Case %d: %lld\n", cas++, ans);
    }
    return 0;
}
發佈了101 篇原創文章 · 獲贊 1 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章