[组合数+bell数] codeforces 569D. Symmetric and Transitive

原创 2016年05月31日 22:37:56

D. Symmetric and Transitive
题意:
一个集合Sn个元素,问它上面的二元关系的数量,要求二元关系满足对称性和传递性,不满足自反性。
题解:
学过离散应该知道,二元关系就是笛卡尔积S×S的子集。
开下脑洞可以想象一个n节点的有向完全图,并且对任意节点我们加上一个自环,任意边的组合就是一个关系,可以看出只要一个关系包含了所有自环,那么这个关系就有自反性。
再想想的话,假如(1,2)(2,1)满足关系P,那么如果不满足关系(1,1)(2,2)的话,那就不满足传递性了,因为根据传递性的定义,1P22P11P1,所以假如我们没有包含x的自环,那么任意x的边都不应该包含。
现在问题就变成了一个n个节点的有向完全图(加入自环),任选k(k>=1)个点去掉,剩下的图中边的任意合法组合(满足自反和对称和传递,满足自反是因为已将不满足的先选出来了),回到集合的角度看,满足自反对称传递就是等价关系,也就是算出去掉k(k>=1)个元素后集合的等价关系的个数,这就是贝尔数了。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 4005;
const ll mod = 1e9+7;
ll C[N][N], bell[N][N];
void cm(ll& x){ if(x >= mod) x -= mod; }
void init(){
    for(int i = 0; i < N; ++i){
        C[i][0] = 1;
        for(int j = 1; j <= i; ++j){
            C[i][j] = C[i-1][j-1] + C[i-1][j];
            cm(C[i][j]);
        }
    }
    bell[1][1] = 1;
    for(int i = 2; i < N; ++i){
        bell[i][1] = bell[i-1][i-1];
        for(int j = 2; j <= i; ++j){
            bell[i][j] = bell[i][j-1]+bell[i-1][j-1];
            cm(bell[i][j]);
        }
    }
}
int main(){
    init();
    ll ans = 0, n;
    cin >> n;
    for(int i = 1; i <= n; ++i){
        ans += C[n][i]*bell[n-i][n-i]%mod;
        cm(ans);
    }
    cout << ans << endl;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

Codeforces Round #315 (Div. 2)569D Symmetric and Transitive(dp)

D. Symmetric and Transitive time limit per test 1.5 seconds memory limit per test 256 megabytes ...
  • GKHack
  • GKHack
  • 2015年08月12日 08:51
  • 1030

codeforces #568B Symmetric and Transitive 快速傅里叶变换

题目大意:给定nn,求有多少组大小为nn的集合上的二元关系,使其满足对称性、传递性,但不满足自反性一组二元关系满足条件等价于存在一个点使其不在任何一个二元关系中考虑将点划分成一些集合,那么大小为11的...
  • PoPoQQQ
  • PoPoQQQ
  • 2015年10月12日 16:05
  • 1563

Codeforces Round #315 (Div. 2) D. Symmetric and Transitive

 枚举能推出其的i个相等的元素(i c[i,j]是组合数,直接用组合数的关系c[i,j] = c[i-1,j-1] + c[i-1,j]求出。 dp[i,j]是 斯特林数 也是贝...

Codeforces Round #315 (Div. 1) B. Symmetric and Transitive(Bell数的应用)(好题)

B. Symmetric and Transitive time limit per test 1.5 seconds memory limit per test 256 me...

codeforces 569 D. Symmetric and Transitive (bell数)

D. Symmetric and Transitive time limit per test 1.5 seconds memory limit per test 256 me...
  • whai362
  • whai362
  • 2015年10月01日 13:45
  • 324

Codeforces Round #404 D. Anton and School - 2 (范德蒙恒等式+组合数)

D. Anton and School - 2题意给定一个字符串 s ,只含有字符 ( 和 )。问 s 有多少个子序列 sub ,满足如下条件: sub 不为空串 sub 为偶数长度 sub 串的前半...

[组合数学] 第一类,第二类Stirling数,Bell数

一.第二类Stirling数         定理:第二类Stirling数S(p,k)计数的是把p元素集合划分到k个不可区分的盒子里且没有空盒子的划分个数。         证明:元素在...

[组合数学] 第一类,第二类Stirling数,Bell数

一.第二类Stirling数         定理:第二类Stirling数S(p,k)计数的是把p元素集合划分到k个不可区分的盒子里且没有空盒子的划分个数。         证明:元素在拿些盒子...

Codeforces 559C Gerald and Giant Chess (dp+组合数+逆元)

题意: 从左上角走到右下角,每走一步只可以往下或者往右,其中有一些不可以走的点(黑点),问有多少种方案。 思路: 看了别人的blog,这不就是一个原题么。。。 知道两个点,原来直接求组合数就可以得到它...

codeforces 341C Iahub and Permutations(组合数dp)

C. Iahub and Permutations time limit per test 1 second memory limit per test 256 megabyt...
  • opm777
  • opm777
  • 2013年10月07日 11:40
  • 1362
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:[组合数+bell数] codeforces 569D. Symmetric and Transitive
举报原因:
原因补充:

(最多只允许输入30个字)