斯特靈數 stiriling

2021-07-16 17:36:09 字數 1641 閱讀 6643

第一類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...