題意,給出n個不同的數,要求二元關係集合(滿足交換律 傳遞律)但不能推出所有的元素都相等的個數。
首先有這樣的一個性質,如果將二元關係用圖來表示,那麼滿足自反傳遞和對稱的元素構成的一定是一個完全子圖。例如對於
這樣的話,求出所有的滿足自反傳遞對稱的關係集合,再用滿足傳遞和對稱的集合減去它就就行了。前一個集合實際上就是對n個元素進行一個劃分,實際上就是bell數。而後一個集合推導有兩種方法,一種是組合數選出滿足自反的元素,劃分成一些連通塊,其他的元素不滿足自反,而這實際上就是bell數的遞推,即
另一個比較好理解的方法是, 相當於對n個元素的集合進行劃分,然後將另一個元素丟到劃分的集合之一,表示該集合內的所有元素都是不滿足自反的,這樣就表示了所有的滿足傳遞和對稱的集合。實際上相當於是對n+1個元素的集合進行劃分,即
那麼,
#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;
}