【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;
}

【NOIP2017提高A组模拟9.17】组合数问题的更多相关文章

  1. 【NOIP2017提高A组模拟9.17】信仰是为了虚无之人

    [NOIP2017提高A组模拟9.17]信仰是为了虚无之人 Description Input Output Sample Input 3 3 0 1 1 7 1 1 6 1 3 2 Sample O ...

  2. 【NOIP2017提高A组模拟9.17】猫

    [NOIP2017提高A组模拟9.17]猫 题目 Description 信息组最近猫成灾了! 隔壁物理组也拿猫没办法. 信息组组长只好去请神刀手来帮他们消灭猫.信息组现在共有n 只猫(n 为正整数) ...

  3. JZOJ5373【NOIP2017提高A组模拟9.17】信仰是为了虚无之人

    题目 分析 我们发现,如果[l,r]的异或和为k是真要求,有且仅当不存在[l,i]和[i,r]两个区间的异或和不为k. 我们用带权并查集了维护这些,但是,由于区间不连续,我们将点权移到边上,对于区间[ ...

  4. JZOJ 100029. 【NOIP2017提高A组模拟7.8】陪审团

    100029. [NOIP2017提高A组模拟7.8]陪审团 Time Limits: 1000 ms  Memory Limits: 131072 KB  Detailed Limits   Got ...

  5. JZOJ 5328. 【NOIP2017提高A组模拟8.22】世界线

    5328. [NOIP2017提高A组模拟8.22]世界线 (File IO): input:worldline.in output:worldline.out Time Limits: 1500 m ...

  6. JZOJ 5329. 【NOIP2017提高A组模拟8.22】时间机器

    5329. [NOIP2017提高A组模拟8.22]时间机器 (File IO): input:machine.in output:machine.out Time Limits: 2000 ms M ...

  7. JZOJ 5307. 【NOIP2017提高A组模拟8.18】偷窃 (Standard IO)

    5307. [NOIP2017提高A组模拟8.18]偷窃 (Standard IO) Time Limits: 1000 ms Memory Limits: 262144 KB Description ...

  8. JZOJ 5286. 【NOIP2017提高A组模拟8.16】花花的森林 (Standard IO)

    5286. [NOIP2017提高A组模拟8.16]花花的森林 (Standard IO) Time Limits: 1000 ms Memory Limits: 131072 KB Descript ...

  9. JZOJ 5305. 【NOIP2017提高A组模拟8.18】C (Standard IO)

    5305. [NOIP2017提高A组模拟8.18]C (Standard IO) Time Limits: 1000 ms Memory Limits: 131072 KB Description ...

随机推荐

  1. Charles使用part3——安装证书&手机抓取https请求

    一.配置 Charles 根证书 1.进入 Charles->Help->SSL Proxying->Install Charles Root Certificate ,会打开证书, ...

  2. linux查找大文件及详细问题

    查询大文件du -h --max-depth=1 查询指定目录下面的文件大小du -h --max-depth=1 /path 使用find命令查找大于200M文件 find / -type f -s ...

  3. 对于button元素的理解

    button有四种常用的类型: submit:  此按钮将表单数据提交给服务器.如果未指定属性,或者属性动态更改为空值或无效值,则此值为默认值. reset:  此按钮重置所有组件为初始值. butt ...

  4. ner处理数据的方式

    ner处理数据的方式biodef load_data(filename): features = [] labels = [] f = open(filename, encoding='utf-8') ...

  5. 《我想进大厂》之Java基础夺命连环16问

    说好了面试系列已经完结了,结果发现还是真香,嗯,以为我发现我的Java基础都没写,所以这个就算作续集了,续集第一篇请各位收好. 说说进程和线程的区别? 进程是程序的一次执行,是系统进行资源分配和调度的 ...

  6. Reactor详解之:异常处理

    目录 简介 Reactor的异常一般处理方法 各种异常处理方式详解 Static Fallback Value Fallback Method Dynamic Fallback Value Catch ...

  7. 两个SQL查询,横向合并为一个查询结果

    第一条sql: select unit,count(*)as number from archives_management group by unit 第二条sql: select fine_uni ...

  8. 谈谈synchronized

    为什么要用synchronized关键字: synchronized是java的一种内部锁,是一种排他锁,通常也被称为悲观锁,它能够保障原子性,可见性,有序性. 当多个线程去调用同一个方法的时候,如果 ...

  9. jQuery其他事件

    ready(fn)当DOM载入就绪可以查询及操作时,绑定一个要执行的函数. resize([[data],fn])当调整浏览器窗口的大小时,发生resize事件.它属于BOM中的window对象. f ...

  10. TCP粘包问题的解决方案02——利用readline函数解决粘包问题

      主要内容: 1.read,write 与 recv,send函数. recv函数只能用于套接口IO ssize_t recv(int sockfd,void * buff,size_t len,i ...