CF 568B Symmetric and Transitive 貝爾數和stirlinig數

題意,給出n個不同的數,要求二元關係集合(滿足交換律 傳遞律)但不能推出所有的元素都相等的個數。
首先有這樣的一個性質,如果將二元關係用圖來表示,那麼滿足自反傳遞和對稱的元素構成的一定是一個完全子圖。例如對於{a,b} 集合滿足自反傳遞對稱,就有以下的二元關係{ab,ba,aa,bb} 。也就是說只有滿足條件的元素纔在一個連通塊內。
這樣的話,求出所有的滿足自反傳遞對稱的關係集合,再用滿足傳遞和對稱的集合減去它就就行了。前一個集合實際上就是對n個元素進行一個劃分,實際上就是bell數。而後一個集合推導有兩種方法,一種是組合數選出滿足自反的元素,劃分成一些連通塊,其他的元素不滿足自反,而這實際上就是bell數的遞推,即

bell(n+1)=k=0n(nk)bell(k)

另一個比較好理解的方法是, 相當於對n個元素的集合進行劃分,然後將另一個元素丟到劃分的集合之一,表示該集合內的所有元素都是不滿足自反的,這樣就表示了所有的滿足傳遞和對稱的集合。實際上相當於是對n+1個元素的集合進行劃分,即bell(n+1)
那麼,
ans=bell(n+1)bell(n)
#include <bits/stdc++.h>

using namespace std;
const int mod = 1000000007;
const int MAXN = 4004;

int dp[MAXN][MAXN];

int main()
{
    int n;
    cin>>n;
    dp[0][0] = 1;
    for(int i = 1;i <= n+1;i++){
        dp[i][0] = dp[i-1][i-1];
        for(int j = 1;j <= i;j++){
            dp[i][j] = (dp[i][j-1]+dp[i-1][j-1])%mod;
        }
    }
    printf("%d\n",(dp[n+1][0]-dp[n][0]+mod)%mod);
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章