zoukankan      html  css  js  c++  java
  • 题解 NOIP2016 组合数问题

    题目描述

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

    $${C_{n}^{m}\ =\ \frac{n!}{m!(n-m)!}}$$

    其中 $${n!=1*2*⋯*}$$ ;特别地,定义 0!=10!=1 。

    小葱想知道如果给定 n,m 和 k ,对于所有的 $${0\leq i\leq n,0\leq j\leq \min \left ( i, m \right )0in,0jmin(i,m)}$$ 有多少对 (i,j)(i,j) 满足 $${C_{i}^{j}}$$ 是 k 的倍数。

    输入输出格式

    输入格式:

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

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

    输出格式:

    共 tt 行,每行一个整数代表所有的 0\leq i\leq n,0\leq j\leq \min \left ( i, m \right )0in,0jmin(i,m) 中有多少对 (i,j)(i,j) 满足 C_i^jCij 是 kk 的倍数。

    输入输出样例

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

    说明

    【样例1说明】

    在所有可能的情况中,只有 C_2^1 = 2C21=2 是2的倍数。

    【子任务】

    解题思路:

    经过推导可以得$${C_n^m\ =\ C_{n-1}^{m-1}\ +\ C_{n-1}^{m}}$$

    由此可以递推得出所有所需要的 $${C_{n}^{m}}$$

    看到k一开始就给我们了,显然可以搞些事情,在预先处理组合数的时候就可以提前对k取模

    然后就是查询有多少个组合数符合要求,那我们可以用前缀和优化一下

    下面上代码:

     1//二维前缀和的边界需要注意
    2#include<bits/stdc++.h>
    3using namespace std;
    4int C[2005][2005],k,T,n,m,sum[2005][2005],a[2005][2005];
    5int main(){
    6    scanf("%d%d",&T,&k);
    7    C[1][1]=C[1][0]=1;
    8    for (int i=1;i<=2001;i++) C[i][0]=1;//递推求解组合数
    9    for (int i=2;i<=2001;i++)
    10        for (int j=1;j<=i;j++){
    11            C[i][j]=C[i-1][j-1]+C[i-1][j],C[i][j]%=k;
    12        }
    13    for (int i=1;i<=2001;i++)//前缀和优化
    14        for (int j=1;j<=2001;j++){
    15            if (C[i][j]==0&&j<=i)
    16                sum[i][j]++;
    17            sum[i][j]+=sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1];
    18        }
    19    while (T--) {//处理询问
    20        scanf("%d%d",&n,&m);
    21        m=min(n,m);
    22        printf("%d\n",sum[n][m]);
    23    } 
    24    return 0;
    25
  • 相关阅读:
    Maximum Flow Exhaustion of Paths Algorithm
    ubuntu下安装java环境
    visualbox使用(二)
    vxworks一个超级奇怪的错误(parse error before `char')
    February 4th, 2018 Week 6th Sunday
    February 3rd, 2018 Week 5th Saturday
    February 2nd, 2018 Week 5th Friday
    February 1st, 2018 Week 5th Thursday
    January 31st, 2018 Week 05th Wednesday
    January 30th, 2018 Week 05th Tuesday
  • 原文地址:https://www.cnblogs.com/titititing/p/9526583.html
Copyright © 2011-2022 走看看