第一類stiriling數:
先給出定義
s(n,k):
個元素的專案分作
個環排列
的方法數目
(此時我們就可以忽略排列的開始元素
舉個例子:
遞推公式為 s(n,k) = (n-1)*s(n-1,k)+s(n-1,k-1)
解釋:當我們考慮到第n個物品的時候:
1.將第n個物品單獨放置 s(n-1,k-1)
2.將第n個物品放置到前面已經放好的物品中,假如放置在第i個物品前,那麼即為 (n-1)*s(n-1,k)
舉例:hdu 4372
n棟房子,高度為1~n
求從左看可以看到的房子數為x,從右看房子數為y的分配房子高度的方法數
資料範圍1-2000
一眼n^3的不可做
除去房子高度為n的房子,放在中間
然後左邊x-1,右邊y-1
我們對每個可以看到的房子 到 不包括下乙個可以看到的房子的 區間看作乙個集合
對剩下的n-1個房子分為x-1+y-1個集合 (
我們取x-1個集合給前面即為組合數c(x-1+y-1,x-1),剩下的給後面
對於左邊,根據每個集合的最大值從左到右排列,這個序列是固定的
每個集合,我們的開始元素一定是這個集合裡面最大的數
現在是不是發現和這個公式可以套上了,因為第一類stiriling公式每個集合的排列可以忽略開始的元素
那麼就是我們現在要求的這個
**如下
/* ^^ *****= ^^
id: meixiuxiu
prog: test
lang: c++11
*/#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pairpii;
#define mem(a,b) memset(a,b,sizeof a)
#define clr(a) memset(a,0,sizeof a);
#define pi acos(-1.0)
#define maxn 2005
#define maxv 100005
const int inf = 0x3f3f3f3f;
const int mod = 1e9 + 7;
ll c[maxn][maxn];
ll stirling[maxn][maxn];
int main()
printf("%lld\n",stirling[n-1][b-1+f-1]*c[b+f-2][f-1]%mod);
}return 0;
}
斯特靈(Stirling)數
遞推式 s n 1,k s n,k 1 n s n,k 解釋 考慮第n 1個元素 1 單獨形成迴圈排列,剩下的有s n,k 1 種方法 2 和別的元素一起形成迴圈排列,n個元素形成迴圈排列的方法數是s n,k 第n 1個可以放在第i個元素左邊,共有n種放法,一共是n s n,k include in...
斯特靈數stirling
count the buildings 不管是從左邊看還是從右邊看,視線總是會被中間最高的給擋住 所以我們把左邊和右邊分組來看。對於某一邊,我們確定出能夠看見的樓房,那麼不能夠看見的樓房就可以任意排列 我們把能看見的樓房,與下乙個能看到的樓房 不包括下乙個樓房 之間的樓看為一組 可以考慮現將最高的拿...
Stirling數 斯特靈數
在組合數學,stirling數可指兩類數,都是由18世紀數學家james stirling提出的。stirling 數有兩種,第一類和第二類 stirling 數,它們自 18世紀以來一直吸引許多數學家的興趣,如尤拉 柯西 西爾沃斯特和凱萊等。後來哥本哈根 copenhagen 大學的尼爾森 nie...