【NOIP2017提高A组模拟9.17】组合数问题

题目

Description

定义"组合数"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.

Input

从problem.in 种读入数据第一行有两个整数t,k,t 代表该测试点总共有多少组测试数据.接下来t 行,每行两个整数n,m.

Output

输出到文件problem.out 中t 行,每行一个整数代表所有的0<=i<=n,0<=j<=min(i,m),有多少对(i,j),满足S(i,j)是k 的倍数.

Sample Input

输入1:

1 2

3 3

输入2:

2 5

4 5

6 7

Sample Output

输出1:

3

样例说明1:S(1,0),S(2,0),S(3,0)均是2 的倍数

输出2:

4

12

Data Constraint

对于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

题解

第二类斯特林数

公式:

\(S(i,j)=S(i-1,j-1)+j*S(i-1,j)\)

证明

  1. 当前这个元素新开一个集合,\(S(i-1,j-1)\)
  2. 当前这个元素进入一个原本存在的集合 \(j*S(i-1,j-1)\)

根据加法定理,两者相加就是答案

预处理的同时\(\%k\)

然后用二维前缀和统计0的个数

Code

#include<cstdio>
#include<iostream>
#define ull unsigned long long
using namespace std;
int t,k,k1,n,m,c[2001][2001],s[2001][2001];
int read()
{
int res=0;char ch=getchar();
while (ch<'0'||ch>'9') ch=getchar();
while (ch>='0'&&ch<='9') res=(res<<1)+(res<<3)+(ch-'0'),ch=getchar();
return res;
}
int main()
{
freopen("problem.in","r",stdin);
freopen("problem.out","w",stdout);
t=read();k=read();
c[1][1]=c[0][0]=1;
for (int i=2;i<=2000;++i)
for (int j=1;j<=min(2000,i);++j)
c[i][j]=(c[i-1][j-1]%k+j*c[i-1][j]%k)%k;
for (int i=0;i<=2000;++i)
for (int j=0;j<=i;++j)
if (c[i][j]==0) s[i][j]=1;
for (int i=1;i<=2000;++i)
s[i][0]+=s[i-1][0],s[0][i]+=s[0][i-1];
for (int i=1;i<=2000;++i)
for(int j=1;j<=2000;++j)
s[i][j]+=s[i-1][j]+s[i][j-1]-s[i-1][j-1];
while (t--)
{
n=read();m=read();
printf("%d\n",s[n][m]);
}
fclose(stdin);
fclose(stdout);
return 0;
}

最新文章

  1. HtmlUnit初探
  2. [poj2406] Power Strings
  3. Cocos2d-x 3.0 事件系统【转】
  4. startup毕业论文
  5. String.IndexOf String.IndexOf String.Substring
  6. Linux 安装配置 JDK 8
  7. wget www.baidu.com执行流程分析
  8. 在ASP.NET MVC中使用JQ插件datatable
  9. H5直播避坑指南
  10. jQuery 合成事件
  11. u-boot调试串口输出对应的系统函数
  12. raid10模型比raid01模型的冗余度高
  13. Window下,利用Anaconda2创建jupyter-notebook的python3环境方法
  14. 手把手教你搭建WEB服务器和FTP服务器
  15. pandas的resample重采样
  16. X5功能目录排序
  17. 爬虫--scrapy+redis分布式爬取58同城北京全站租房数据
  18. 入门angularJs笔记手记一
  19. python-多进程类封装
  20. Smarty配置与实例化

热门文章

  1. 什么是 RedLock
  2. malloc,calloc,realloc三者的区别
  3. day83:luffy:添加购物车&amp;导航栏购物车数字显示&amp;购物车页面展示
  4. 求0到n之间素数个数的序列
  5. MapReduce在Shuffle阶段按Mapper输出的Value进行排序
  6. 直播软件开发之Java音视频解决方案:音视频基础知识
  7. layui的laypage实现分页/查询
  8. 力扣 - 146. LRU缓存机制
  9. SPA 路由三部曲之核心原理
  10. Visual Studio2013应用笔记---WinForm事件中的Object sender和EventArgs e参数