hdu 4045(组合数学,第二类斯特林数)
2015-12-19 15:06
441 查看
hdu 4045
题目大意:从n台机器中取r台,要求任意两台的序号差不小于k,再将这r台机器最多分为m组(每不为空),求共有多少种可能;
思路:
在选中的r台机器两两间插入k - 1台机器;
例如:r = 3, k = 3 : 1 0 0 1 0 0 1 0 0 1 (1 为选中的)
剩余t = n - ((r - 1) * ( k - 1) + r) = n - ((r - 1) * k + 1);
再将 t 分为 r 组(可为空) , 为c(t + r, r)//可视为共有t + r 个相同元素,挑出r个作为隔板
再套用第二类斯特林数求出∑mi=0s(r,i);
两者结果相乘
题目大意:从n台机器中取r台,要求任意两台的序号差不小于k,再将这r台机器最多分为m组(每不为空),求共有多少种可能;
思路:
在选中的r台机器两两间插入k - 1台机器;
例如:r = 3, k = 3 : 1 0 0 1 0 0 1 0 0 1 (1 为选中的)
剩余t = n - ((r - 1) * ( k - 1) + r) = n - ((r - 1) * k + 1);
再将 t 分为 r 组(可为空) , 为c(t + r, r)//可视为共有t + r 个相同元素,挑出r个作为隔板
再套用第二类斯特林数求出∑mi=0s(r,i);
两者结果相乘
#include <iostream> #define MOD 1000000007 #define LL __int64 #define N 1001 using namespace std; LL s = {1}, c[2 * N][2 * N]; void init() { for(int i = 1; i <= 2000; 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; } } for(int i = 1; i <= 1000; i++) { s[i][0] = 0; s[i][i] = 1; for(int j = 1; j < i; j++) { s[i][j] = ((LL)j * s[i-1][j] + s[i-1][j-1]) % MOD; } } } int main() { init(); int n, r, k, m; while (~scanf("%d%d%d%d", &n, &r, &k, &m)) { int t = (r - 1) * k + 1; if (n - t < 0) { printf("0\n"); } else { LL sum = 0; LL ans1 = c[n - t + r][r]; for (int i = 1; i <= min(r, m); i++) { sum = (sum + s[r][i]) % MOD; } cout << (sum * ans1) % MOD << endl; } } }
相关文章推荐
- 组合数求模总结
- [Java] 计算组合数的代码
- poj1850~Code~(组合数的应用)
- HDU 3625 Examining the Rooms(斯特林数)
- hdu 5490 Simple Matrix 递推公式+逆元+组合数
- 编程算法 - 计算一个数的所有组合数 代码(C++)
- 编程算法 - 组合数 代码(C)
- FZU 1570 集合划分问题
- SPOJ NWERC11A Binomial coefficients
- 2014-2015 ACM-ICPC, Asia Xian Regional Contest F Color
- NYOJ--32(搜索)-题目-----------------------------组合数
- nyoj 组合数
- nyoj 组合数
- 蓝桥杯 代码填空 组合数 递归
- Codevs P1157 2k进制数 2006年NOIP全国联赛提高组
- 组合数最后非零位:poj 3406 Last digit
- 南邮 OJ 1096 组合数
- SPOJ 16607. Sweets
- SPOJ 16639. Endless Knight
- 组合数算法