您的位置:首页
hdu 4372 第一类斯特林数
2017-08-18 20:51
417 查看
#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组的问题。看完答案想到这么多。。
。。
。。
。
相关文章推荐
- hdu 4372 Count the Buildings(第一类斯特林数)
- hdu 4372 第一类斯特林数
- HDU 4372 Count the Buildings [第一类斯特林数]
- [第一类斯特林数 组合] HDU 4372 Count the Buildings
- 【HDU 4372】 Count the Buildings (第一类斯特林数)
- HDU 4372: Count the Buildings 第一类斯特林数 组合数学
- 【第一类斯特林数】HDU_4372_ Count the Buildings
- Examining the Rooms - HDU 3625 第一类斯特林数
- Count the Buildings HDU - 4372 第一类striling 数
- HDU 3625 第一类斯特林数
- [HDU]4372 Count the Buildings 第一类斯特林数
- [HDU 4372]Count the Buildings(第一类斯特林数+组合数)
- hdu 3625 Examining the Rooms(第一类斯特林数)
- Count the Buildings HDU - 4372 第一类striling 数
- Count the Buildings HDU - 4372 第一类striling 数
- Count the Buildings HDU - 4372 第一类striling 数
- Count the Buildings HDU - 4372 第一类striling 数
- Count the Buildings HDU - 4372 第一类striling 数
- HDU 3625 Examining the Rooms(第一类斯特林数)
- Count the Buildings HDU - 4372 第一类striling 数