zoukankan      html  css  js  c++  java
  • 一种递推组合数前缀和的Trick

    记录一下一种推组合数前缀和的方法

    Trick

    (sum_{i = 0}^m C_n^i = S(n, m))

    (S)是可以递推的

    • (S(n, m + 1) = S(n, m) + C_{n}^{m + 1})

    就是加上最末尾的一项

    • (S(n + 1, m) = 2S(n, m) - C_n^m)

    (S(n, m))可以看做是杨辉三角上的一行,而(S(n+1, m))是他的下一行

    考虑组合数的递推公式,除了(C[n][m])这一项之外都会被计算两次、

    另外如果有多组询问的话可以用莫队实现

    #include<bits/stdc++.h>
    using namespace std;
    int N, M, Lim, C[1001][1001], S[1001][1001];
    int Make1() {
    	for(int i = 0; i <= Lim; i++) {
    		C[i][0] = C[i][i] = 1;
    		for(int j = 1; j < i; j++)
    			C[i][j] = C[i - 1][j - 1] + C[i - 1][j];		
    	}
    	return C[N][M];
    }
    void Make2() {
    	/*for(int i = 0; i <= Lim; i++) {
    		S[i][0] = 1;
    		for(int j = 1; j <= i; j++)
    			S[i][j] = S[i][j - 1] + C[i][j];		
    	}*/
    	for(int i = 0, base = 1; i <= Lim; i++, base <<= 1) {
    		S[i][i] = base;
    		for(int j = i + 1; j <= Lim; j++)
    			S[j][i] = 2 * S[j - 1][i] - C[j - 1][i];		
    	}
    }
    void print(int (*a)[1001]) {
    	for(int i = 0; i <= Lim; i++, puts("")) {
    		for(int j = 0; j <= i; j++)
    			printf("%d ", S[i][j]);		
    	}
    }
    main() {
    	Lim = 10;
    	//cin >> N >> M;
    	Make1();
    	Make2();
    	print(S);
    	
    }
    
  • 相关阅读:
    bean的作用域和生命周期
    装配Bean的三种方式
    BeanFactory和ApplicationContext对比
    创建 Spring容器的三种方式
    约束
    三大范式
    事务
    EdgeRank
    TCP三次握手四次挥手
    Linux权限解释
  • 原文地址:https://www.cnblogs.com/zwfymqz/p/9751173.html
Copyright © 2011-2022 走看看