• hdu 2643 Rank hdu 2512 一卡通大冒险 stirling (斯特灵数)的应用


    hdu 2643
    /*
     第二类Stirling数是把包含n个元素的集合划分为正好k个非空子集的方法的数目。
     递推公式为:
     S(n,k) = 0(n<k||k=0),
     S(n,n) = S(n,1) = 1,
     S(n,k) = S(n-1,k-1) + kS(n-1,k).
     */

    #include<stdio.h>
    #define LL long long
    #define nmax 101
    #define nnum 20090126LL
    LL num[nmax][nmax], fac[nmax];
    void init() {
    	int i, j;
    	for (i = 1, fac[0] = 1; i < nmax; i++) {
    		fac[i] = fac[i - 1] * i % nnum;
    	}
    	for (i = 1; i < nmax; i++) {
    		num[i][1] = 1;
    		num[i][0] = 0;
    	}
    	for (i = 2; i < nmax; i++) {
    		for (j = 1; j < nmax; j++) {
    			if (i == j) {
    				num[i][i] = 1;
    			} else {
    				num[i][j] = (num[i - 1][j - 1] + num[i - 1][j] * j) % nnum;
    			}
    		}
    	}
    }
    int main() {
    #ifndef ONLINE_JUDGE
    	freopen("in.data", "r", stdin);
    #endif
    	init();
    	int T, N, i;
    	LL res;
    	while (scanf("%d", &T) != EOF) {
    		while (T--) {
    			scanf("%d", &N);
    			for (i = 1, res = 0; i <= N; i++) {
    				res += num[N][i] * fac[i];
    				res %= nnum;
    			}
    			printf("%I64d\n", res);
    		}
    	}
    
    	return 0;
    }
    

    hdu 2512

    #include<stdio.h>
    #define nmax 2001
    #define nnum 1000
    int num[nmax][nmax];
    void init() {
    	int i, j;
    	for (i = 1; i < nmax; i++) {
    		num[i][0] = 0, num[i][1] = 1;
    	}
    	for (i = 2; i < nmax; i++) {
    		for (j = 1; j < nmax; j++) {
    			if (i == j) {
    				num[i][i] = 1;
    				continue;
    			}
    			num[i][j] = (num[i - 1][j - 1] + num[i - 1][j] * j) % nnum;
    		}
    	}
    }
    int main() {
    #ifndef ONLINE_JUDGE
    	freopen("in.data", "r", stdin);
    #endif
    	int n, x, i, res;
    	init();
    	while (scanf("%d", &n) != EOF) {
    		while (n--) {
    			scanf("%d", &x);
    			for (i = 1, res = 0; i <= x; i++) {
    				res += num[x][i];
    				res %= nnum;
    			}
    			printf("%d\n", res);
    		}
    	}
    	return 0;
    }
    
    小知识:

    Bell数,又称为贝尔数。
    是以埃里克·坦普尔·贝尔(Eric Temple Bell)为名的。

    B(n)是包含n个元素的集合的划分方法的数目。

    B(0) = 1, B(1) = 1, B(2) = 2, B(3) = 5,
    B(4) = 15, B(5) = 52, B(6) = 203,...

    递推公式为,
    B(0) = 1,
    B(n+1) = Sum(0,n) C(n,k)B(k). n = 1,2,...

    其中,Sum(0,n)表示对k从0到n求和,C(n,k) = n!/[k!(n-k)!]

    -------------------------
    Stirling数,又称为斯特灵数。
    在组合数学,Stirling数可指两类数,都是由18世纪数学家James Stirling提出的。

    第一类Stirling数是有正负的,其绝对值是包含n个元素的集合分作k个环排列的方法数目。

    递推公式为,
    S(n,0) = 0, S(1,1) = 1.
    S(n+1,k) = S(n,k-1) + nS(n,k)。

    第二类Stirling数是把包含n个元素的集合划分为正好k个非空子集的方法的数目。

    递推公式为,
    S(n,n) = S(n,1) = 1,
    S(n,k) = S(n-1,k-1) + kS(n-1,k).
    将n个有区别的球的球放入k个无标号的盒子中( n>=k>=1,且盒子不允许为空)的方案数就是stirling数.(即含 n 个元素的集合划分为 k 个集合的情况数)

      递推公式:

      S(n,k) = 0 (k > n)

      S(n,1) = 1 (k = 1)

      s(n,k)=1 (n=k)

      S(n,k) = S(n-1,k-1)+k*S(n-1,k) (n >= k >= 2)

      分析:设有n个不同的球,分别用b1,b2,...,bn表示。从中取出一个球bn,bn的放法有以下两种:

      1.bn独占一个盒子,那么剩下的球只能放在k-1个盒子里,方案数为S(n-1,k-1);

      2.bn与别的球共占一个盒子,那么可以将b1,b2,...,bn-1这n-1个球放入k个盒子里,然后将bn放入其中一个盒子中,方案数为k*S(n-1,m).


    -------------
    bell数和stirling数的关系为,

    每个贝尔数都是"第二类Stirling数"的和。

    B(n) = Sum(1,n) S(n,k).

    参考资料:http://planetmath.org/?op=getobj&from=objects&id=9059

  • 相关阅读:
    MySQL的存储引擎
    MySQL的索引及执行计划
    MySQL的SQL基础应用
    MySQL基础入门
    代码质量检测SonarQube
    Jenkins持续集成
    Git版本控制及gitlab私有仓库
    jumpserver跳板机
    Keepalived高可用服务
    well-known file is not secure
  • 原文地址:https://www.cnblogs.com/xiaoxian1369/p/2154783.html
Copyright © 2020-2023  润新知