• 组合数问题


    组合数公式:

    计算组合数的递推方法:

    C[i, j] := C[i - 1, j] + C[i - 1, j - 1]  (0 < i ≤ j ≤ m ≤ n)

    与杨辉三角在形式上一致。

    区别:预处理的初始值。

    代码:

    for (int i = 1; i <= n; i++) {
    	c[i][1] = i % k; c[i][i] = 1; // 预处理 
    }
    for (int i = 2; i <= n; i++) 
    	for (int j = 2; j <= i - 1; j++) // 递推
    		c[i][j] = (c[i - 1][j] % k + c[i - 1][j - 1] % k) % k;
    

    例题:Luogu P2822 组合数问题

    题目描述

    组合数表示的是从n个物品中选出m个物品的方案数。举个例子,从(1,2,3) 三个物品中选择两个物品可以有(1,2),(1,3),(2,3)这三种选择方法。根据组合数的定 义,我们可以给出计算组合数的一般公式:

    其中n! = 1 × 2 × · · · × n

    小葱想知道如果给定n,m和k,对于所有的0 <= i <= n,0 <= j <= min(i,m)有多少对 (i,j)满足是k的倍数。

    输入输出格式

    输入格式:

    第一行有两个整数t,k,其中t代表该测试点总共有多少组测试数据,k的意义见 【问题描述】。

    接下来t行每行两个整数n,m,其中n,m的意义见【问题描述】。

    输出格式:

    t行,每行一个整数代表答案。

    输入输出样例

    输入样例#1:
    1 2
    3 3
    输出样例#1:
    1
    输入样例#2:
    2 5
    4 5
    6 7
    输出样例#2:
    0
    7
    

    说明

    【样例1说明】

    在所有可能的情况中,只有是2的倍数。

    【子任务】

    CODES:

    /* P2822 组合数问题
     * Au: GG
     * C_n^m=frac{n!}{m!(n - m)!}
     * 预处理 DP O(n^2) + 统计 O(n)
     */
    #include <cstdio>
    #include <cstdlib>
    #include <cstring>
    #include <cmath>
    #include <ctime>
    #include <iostream>
    #include <algorithm>
    using namespace std;
    const int N = 2000 + 3, Nx = 2001;
    int n, m, t, k, ans, c[N][N], d[N][N];
    
    int main() {
    	scanf("%d%d", &t, &k);
    	for (int i = 1; i <= Nx; i++) {
    		c[i][1] = i % k; c[i][i] = 1;
    	}
    	for (int i = 2; i <= Nx; i++) 
    		for (int j = 2; j <= i - 1; j++) 
    			c[i][j] = (c[i - 1][j] % k + c[i - 1][j - 1] % k) % k;
    	for (int i = 1; i <= Nx; i++)
    		for (int j = 1; j <= i; j++) {
    			if (c[i][j]) d[i][j] = d[i][j - 1];
    			else d[i][j] = d[i][j - 1] + 1;
    		}
    	while (t--) {
    		scanf("%d%d", &n, &m);
    		ans = 0;
    		for (int i = 1; i <= n; i++) {
    			if (i > m) ans += d[i][m]; else ans += d[i][i];
    		}
    		printf("%d
    ", ans);
    	}
    	
    	return 0;
    }
    

    Post author 作者: Grey
    Copyright Notice 版权说明: Except where otherwise noted, all content of this blog is licensed under a CC BY-NC-SA 4.0 International license. 除非另有说明,本博客上的所有文章均受 知识共享署名 - 非商业性使用 - 相同方式共享 4.0 国际许可协议 保护。
  • 相关阅读:
    springmvc(架构、组件、视图解析器的配置)
    springmvc(mvc、springmvc、springmvc入门程序)
    jvm类文件结构解析(访问标志、异常)
    软件工程(项目前期)
    jvm:java类文件结构(字节码文件的解析)
    Mybatis动态sql(if、where、sql、foreach、choose)
    ARM指令系统(CISC与RISC、新建工程)
    pyppeteer之流程解析
    Puppeteer简介及安装
    selenium之前进后退
  • 原文地址:https://www.cnblogs.com/greyqz/p/7214769.html
Copyright © 2020-2023  润新知