• 贝尔数--Codeforces908E. New Year and Entity Enumeration


    给n<=50个长度m<=1000的二进制数,记他们为集合T,求满足下面条件的集合S数:令$M=2^m-1$,1、$a epsilon S Rightarrow a xor M epsilon S$;2、$a epsilon S,b epsilon S Rightarrow a and b epsilon M$;3、$T subseteq S$;4、S中每个数都<=M。答案膜1e9+7。

    首先不看这T个数,先想想自由状态下有多少个S。由条件1可知,对m个二进制位,S中一定有一个数使得这一位不为空。那么经过若干的and操作就可以把含这一位(i)的数变小变小再变小,变到最小记f(i)。可以发现$f(x) eq f(y) Rightarrow f(x) and f(y) =0$。如果不这样,那么$f(x) and (f(y) xor M)$可以得到一个比f(x)更小的,且在x这一位为1的数,就矛盾。

    那么自由状态下就相当于把m个位置划分成若干个集合,每个集合里的x的f(x)共享,比如{2,4}对应f(2)=f(4)=1010,问有多少方案。这就是贝尔数了。

    贝尔数性质:转自此

    n^2递推的话还有:令$B(0,0)=1,B(i,0)=B(i-1,i-1),B(i,j)=B(i-1,j-1)+B(i,j-1)$,则$B(i,0)$就是第i个贝尔数。

    OK现在加入T的限制。在T的限制下,令R(i)表示数位i在n个数的状态,就是R(i)的第j位表示第j个数的第i位是1还是0。R(i)不同的两位,在分配集合时绝对绝对不能分在一个集合,因为如果$R(x) eq R(y),f(x) = f(y)$,那么f(x)与那个导致两个R不相同的数and一下,就可以得到一个更小的f(x),矛盾。所以根据R(i)的不同把位分成若干组,每组算一个贝尔数即可。

     1 //#include<iostream>
     2 #include<cstring>
     3 #include<cstdlib>
     4 #include<cstdio>
     5 #include<map>
     6 //#include<bitset>
     7 #include<algorithm>
     8 //#include<cmath>
     9 using namespace std;
    10 
    11 int n,m;
    12 #define LL long long
    13 LL state[1011],str[1011][1011];
    14 map<LL,int> mp;
    15 const int mod=1e9+7;
    16 int main()
    17 {
    18     scanf("%d%d",&m,&n); LL x;
    19     for (int i=0;i<n;i++)
    20         for (int j=0;j<m;j++)
    21             scanf("%1lld",&x),state[j]|=(x<<i);
    22     for (int i=0;i<m;i++) mp[state[i]]++;
    23     str[0][0]=1;
    24     for (int i=1;i<=m;i++)
    25     {
    26         str[i][0]=str[i-1][i-1];
    27         for (int j=1;j<=i;j++) str[i][j]=str[i][j-1]+str[i-1][j-1],str[i][j]-=str[i][j]>=mod?mod:0;
    28     }
    29     int ans=1;
    30     for (map<LL,int>::iterator i=mp.begin();i!=mp.end();i++) ans=1ll*ans*str[(*i).second][0]%mod;
    31     printf("%d
    ",ans);
    32     return 0;
    33 } 
    View Code
  • 相关阅读:
    java中如何获得系统路径!(项目的路径)
    纯DOS学习笔记
    Ubuntu 初始配置
    原码、反码、补码
    几个小程序
    数据类型字符串、字节
    rdesktop方法(Linux to Windows)
    Python语言说明
    Manjaro 初始配置anacondapycharmopencvtensorflow
    【转】谈谈MATLAB中cell数据类型
  • 原文地址:https://www.cnblogs.com/Blue233333/p/8205571.html
Copyright © 2020-2023  润新知