• 洛谷——P2822 组合数问题


    https://www.luogu.org/problem/show?pid=2822

    题目描述

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

    C_n^m=frac{n!}{m!(n - m)!}Cnm​​=m!(nm)!n!​​

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

    小葱想知道如果给定n,m和k,对于所有的0 <= i <= n,0 <= j <= min(i,m)有多少对 (i,j)满足C_i^jCij​​是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说明】

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

    【子任务】

     1 #include <cstdio>
     2 
     3 inline void read(int &x)
     4 {
     5     x=0; register char ch=getchar();
     6     for(; ch>'9'||ch<'0'; ) ch=getchar();
     7     for(; ch>='0'&&ch<='9'; ch=getchar()) x=x*10+ch-'0';
     8 }
     9 const int N(2333);
    10 int t,k,fac[N];
    11 int C[N][N],sum[N][N];
    12 
    13 int Presist()
    14 {
    15     read(t),read(k);
    16     for(int i=0; i<=2000; ++i) C[i][0]=C[i][i]=1%k;
    17     for(int i=1; i<=2000; ++i)
    18       for(int j=1; j<i; ++j)
    19         C[i][j]=(C[i-1][j-1]%k+C[i-1][j]%k)%k;
    20     for(int i=1; i<=2000; ++i)
    21       for(int j=1; j<=2000; ++j)
    22         sum[i][j]=sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1]+(!C[i][j]&&i>=j);
    23     for(int n,m; t--; )
    24     {
    25         read(n),read(m);
    26         printf("%d
    ",sum[n][m]);
    27     }
    28     return 0;
    29 }
    30 
    31 int Aptal=Presist();
    32 int main(int argc,char**argv){;}
    ——每当你想要放弃的时候,就想想是为了什么才一路坚持到现在。
  • 相关阅读:
    innodb的存储结构
    使用zabbix邮件发送报表
    如何使用yum下载rpm包
    redis cluster节点管理测试
    redis迁移工具-redis-migrate-tool使用测试
    redis客户端连接异常
    redis sentinel基本命令与参数
    [转]redis-cli的一些有趣也很有用的功能
    [转]为什么使用 Redis及其产品定位
    Redis多机常用架构-cluster
  • 原文地址:https://www.cnblogs.com/Shy-key/p/7465760.html
Copyright © 2020-2023  润新知