hdu 4372 第一类斯特林数
2015-08-21 21:27
330 查看
[code]#include <cstdio> #include <iostream> #include <algorithm> #include <queue> #include <cmath> #include <cstring> #include <stack> #include <set> #include <map> #include <vector> using namespace std; #define INF 0x2fffffff #define LL long long #define MAX(a,b) ((a)>(b))?(a):(b) #define MIN(a,b) ((a)<(b))?(a):(b) #define MOD 1000000007 LL s[2005][2005]; LL C[2005][2005]; int main(){ int t; cin >> t; s[0][0]=s[1][1]=1; for(int i=2;i<2005;i++){ for(int j=1;j<=i;j++){ s[i][j]=s[i-1][j-1]+(i-1)*s[i-1][j]; s[i][j]%=MOD; } } for(int i=0;i < 2005;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]; C[i][j]%=MOD; } } while(t--){ int n,f,b; scanf("%d%d%d",&n,&f,&b); LL ans = s[n-1][f+b-2]*C[f+b-2][f-1]; ans %= MOD; printf("%I64d\n",ans); } return 0; }
从后面看和从前面看的分界线是最高的那根,去掉最高的那根之后还剩下n-1根,然而对于从后面和从前面看都会看到最长的那根,那根独自成为一组,然后前后就是f-1和b-1组,然后就是总的要分为b+f-2组,你从这些组里面取f-1或者b-1作为前后就行了,。
如果一直把前后分开算的话就要枚举,,,,但是为什么要分开,但是明显前后是被最长的那根分开的,除了出现在前后的区别前后的分组其实是完全一样的,只是出于最长那根左右的区别,去掉最长的那根自然就变成了一个把n-1个东西分成f+b-2组的问题。看完答案想到这么多。。。。。。。
相关文章推荐
- poj1276(dp)
- HPU 1707:求解不等式【SPFA & 差分约束】
- 一个C++的平衡二叉树例子
- OC中NSMutableArray 和NSMutableDictionary 中打印乱码问题
- scaleType-模拟按钮加文字整天点击效果
- 黑马程序员--Java基础学习(面向对象)第七天
- View和ViewGroup的事件分发机制详解
- hdu5414 CRB and String
- 长链非编码RNA(lncRNA)
- Linux系统管理之十四---服务
- 后端分布式系列:分布式存储-HDFS 架构解析
- 后端分布式系列:分布式存储-HDFS 架构解析
- ShapeDrawable做放大镜效果
- ShapeDrawable做放大镜效果
- shell编程——if条件判断(转)
- java并发编程---如何创建线程以及Thread类的使用
- ShapeDrawable做放大镜效果
- 用 mongodb + elasticsearch 实现中文检索
- 后端分布式系列:分布式存储-HDFS 架构解析
- Android UI设计——EditText控件