杨辉三角与组合数的关系(百度之星17年初赛B第一题)

杨辉三角如下:

        1
       1 1
      1 2 1
     1 3 3 1
    1 4 6 4 1
   1 5 10 10 5 1
  1 6 15 20 15 6 1
 1 7 21 35 35 21 7 1
1 8 28 56 70 56 28 8 1

有一个规律,就是杨辉三角中第 n 行第 k 个数是 C(k, n) 组合。因此,如果需要求出小范围组合数时可以使用求出范围内的杨辉三角。
求杨辉三角的时候,注意还有一个公式就是 C(m, n) = C(m-1, n-1) + C(m, n-1)

Problem Description
車是中国象棋中的一种棋子,它能攻击同一行或同一列中没有其他棋子阻隔的棋子。一天,小度在棋盘上摆起了许多車……他想知道,在一共N×M个点的矩形棋盘中摆最多个数的車使其互不攻击的方案数。他经过思考,得出了答案。但他仍不满足,想增加一个条件:对于任何一个車A,如果有其他一个車B在它的上方(車B行号小于車A),那么車A必须在車B的右边(車A列号大于車B)。

现在要问问你,满足要求的方案数是多少。
 
Input
第一行一个正整数T,表示数据组数。

对于每组数据:一行,两个正整数N和M(N<=1000,M<=1000)。
 
Output
对于每组数据输出一行,代表方案数模1000000007(1e9+7)。
 
Sample Input
1 1 1
 
Sample Output
1
 
复制代码
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <vector>
#include <cstring>
#include <cstdlib>

using namespace std;

#define MOD 1000000007

int C[1001][1001];

void init(void)
{
    memset(C, 0, sizeof(C));
    for (int i = 1; i < 1001; ++i)
    {
        C[i][0] = C[i][i] = 1;
        for (int j = 1; j < i; ++j)
            C[i][j] = (C[i-1][j-1]+C[i-1][j]) % MOD;
    }
}


int main(void)

{
    init();
    int T = 0;
    scanf("%d", &T);
    while(T-- > 0)
    {
        int maxn = 0, minn = 0;
        if (maxn < minn) swap(maxn, minn);
        printf("%d\n", C[minn][maxn]);
    }
}
复制代码

 

参考链接: 

http://www.cnblogs.com/shinianhuanniyijuhaojiubujian/p/7355789.html

(杨辉三角,组合数,二项式三者之间的关系)http://www.cnblogs.com/liuzhanshan/p/6293175.html

posted on   daghlny  阅读(471)  评论(0编辑  收藏  举报

编辑推荐:
· .NET 依赖注入中的 Captive Dependency
· .NET Core 对象分配(Alloc)底层原理浅谈
· 聊一聊 C#异步 任务延续的三种底层玩法
· 敏捷开发:如何高效开每日站会
· 为什么 .NET8线程池 容易引发线程饥饿
阅读排行:
· 终于决定:把自己家的能源管理系统开源了!
· [.NET] 使用客户端缓存提高API性能
· 外部H5唤起常用小程序链接规则整理
· C#实现 Winform 程序在系统托盘显示图标 & 开机自启动
· WPF 怎么利用behavior优雅的给一个Datagrid添加一个全选的功能
点击右上角即可分享
微信分享提示