杨辉三角与组合数的关系(百度之星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)。
对于每组数据:一行,两个正整数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
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】博客园携手 AI 驱动开发工具商 Chat2DB 推出联合终身会员
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET 依赖注入中的 Captive Dependency
· .NET Core 对象分配(Alloc)底层原理浅谈
· 聊一聊 C#异步 任务延续的三种底层玩法
· 敏捷开发:如何高效开每日站会
· 为什么 .NET8线程池 容易引发线程饥饿
· 终于决定:把自己家的能源管理系统开源了!
· [.NET] 使用客户端缓存提高API性能
· 外部H5唤起常用小程序链接规则整理
· C#实现 Winform 程序在系统托盘显示图标 & 开机自启动
· WPF 怎么利用behavior优雅的给一个Datagrid添加一个全选的功能