BOJ 389 Bricks

来源:互联网 发布:js base64转换为文件 编辑:程序博客网 时间:2024/06/09 21:18

题意:给你1-N个长度不相同的N个木棒,将其竖起成一行。求从左面看能看到L个木棒和从右面看能看到R个木棒的所有排列数目。

思路:

代码:

#include <cstdio>#include <cstring>using namespace std;const int MAXN = 5010;const int MOD = 1000000007;int N, L, R;long long C[MAXN][MAXN];long long dp[MAXN][MAXN];void init(){for (int i = 0; i < MAXN; ++i)C[i][0] = 1;for (int i = 1; i < MAXN; ++i)for (int j = 1; j <= i; ++j)C[i][j] = (C[i - 1][j - 1] + C[i - 1][j]) % MOD;    memset(dp, 0, sizeof(dp));    for (int i = 1; i <= 5001; ++i){dp[i][0] = 1;for (int j = 1; j <= i - 2; ++j)dp[i][j] = (dp[i - 1][j] + dp[i - 1][j - 1] * (i - 2)) % MOD;}return;}int main(void){int T;scanf("%d", &T);init();while (T--){long long res = 0;scanf("%d %d %d", &N, &L, &R);res = C[L + R - 2][L - 1] * dp[N][N - L - R + 1] % MOD;printf("%lld\n", res);}return 0;}

0 0