zoukankan      html  css  js  c++  java
  • 组合数问题(zyys版)

    【问题描述】
    定义"组合数"S(n,m)代表将 n 个不同的元素拆分成 m 个非空集合的方案
    数.举个栗子,将{1,2,3}拆分成 2 个集合有({1},{2,3}),({2},{1,3}),({3},{1,2})三种拆分
    方法.
    小猫想知道,如果给定 n,m 和 k,对于所有的 0<=i<=n,0<=j<=min(i,m),有多少对
    (i,j),满足 S(i,j)是 k 的倍数.
    注意,0 也是 k 的倍数,S(0,0)=1,对于 i>=1,S(i,0)=0.
    【输入格式】
    从 problem.in 种读入数据
    第一行有两个整数 t,k,t 代表该测试点总共有多少组测试数据.
    接下来 t 行,每行两个整数 n,m.
    【输出格式】
    输出到文件 problem.out 中
    t 行,每行一个整数代表所有的 0<=i<=n,0<=j<=min(i,m),有多少对(i,j),满足 S(i,j)
    是 k 的倍数.
    【样例输入 1】
    12
    33
    【样例输出 1】
    3
    【样例说明 1】
    S(1,0),S(2,0),S(3,0)均是 2 的倍数
    【样例输入 2】
    25
    45
    67
    【样例输出 2】
    4
    12
    【数据规模与约定】
    对于 20%的数据,满足 n,m<=7,k<=5
    对于 60%的数据,满足 n,m<=100,k<=10
    对于每个子任务,都有 50%的数据满足 t=1
    对于 100%的数据,满足 1<=n<=2000,1<=m<=2000,2<=k<=21,1<=t<=10000

    斯特林数(II)

    S[i][j]=S[i-1][j-1]+j*S[i-1][j]

    解释一下:

    对于i,j,它可以单独构成j集合,前面要有j-1个集合

    也可以放入前面的集合

    因为集合非空,所以前面的集合要有j个,有j种选择

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<algorithm>
     5 using namespace std;
     6 int k,t,n,m;
     7 long long S[2001][2001],a[2001][2001];
     8 int main()
     9 {int i,j;
    10   cin>>t>>k;
    11   S[0][0]=1;
    12   for (i=1;i<=2000;i++)
    13     {
    14       S[i][0]=0;
    15       for (j=1;j<=i;j++)
    16     {
    17       S[i][j]=(S[i-1][j-1]+S[i-1][j]*j)%k;
    18     }
    19     }
    20   for (i=0;i<=2000;i++)
    21     {
    22       for (j=0;j<=i;j++)
    23     {
    24       if (S[i][j]==0)
    25         a[i][j]=1;
    26     }
    27     }
    28   for (i=1;i<=2000;i++)
    29     {
    30       for (j=1;j<=2000;j++)
    31     a[i][j]+=a[i][j-1];
    32     }
    33   for (i=1;i<=2000;i++)
    34     {
    35       for (j=0;j<=2000;j++)
    36     a[i][j]+=a[i-1][j];
    37     }
    38   while (t--)
    39     {
    40       scanf("%d%d",&n,&m);
    41       printf("%lld
    ",a[n][m]);
    42     }
    43 }
  • 相关阅读:
    浅谈c/c++中的指针问题
    谈谈八大排序算法问题
    隐藏在default construct后面的是什么
    浅谈编译过程和符号表重定位问题
    1.在VC编译器下面为什么每个头文件以及源文件都要包含“stdAfx.h”,那么stdAfx.h中到底存放了什么,用来做什么?
    成长从今天开始
    正则表达式
    安装RPM包或者安装源码包
    文档的压缩与打包
    文本编辑工具
  • 原文地址:https://www.cnblogs.com/Y-E-T-I/p/7615051.html
Copyright © 2011-2022 走看看