题目链接:https://www.luogu.org/problemnew/show/P2822

题意:输入T和k,有T组询问。每组询问输入n、m,求C(i,j)能模k的个数(0<=i<=n,0<=j<=min(i,m))。

思路:首先需要离线操作,因为n<=2000,我们可以把所有可能的n,m的结果全求出来。用dp[i][j]表示C(x,y)能模k的个数(0<=x<=i,0<=y<=min(x,m)),f[i][j]表示C(i,y)能模k的个数(0<=y<=min(i,m)),C[i][j]表示组合数C(i,j)能否整除k,若能,值为0,否则不为0。

则有如下状态转移方程:

C[i][j]=(C[i-1][j-1]+C[i-1][j])%k

f[i][j]=f[i][j-1]+(C[i][j]==0)

dp[i][j]=dp[i-1][j]+f[i][j]

但是要注意边界的特殊情况。

AC代码:

#include<cstdio>
#include<algorithm>
using namespace std; const int maxn=; int dp[maxn][maxn],f[maxn][maxn],C[maxn][maxn];
int T,k,n,m; void init(){
C[][]=%k;
for(int i=;i<=;++i){
C[i][]=%k;
for(int j=;j<=i;++j)
C[i][j]=(C[i-][j-]+C[i-][j])%k;
} f[][]=(C[][]==);
for(int i=;i<=;++i){
f[i][]=(C[i][]%k==);
for(int j=;j<=i;++j)
f[i][j]=f[i][j-]+(C[i][j]==);
} dp[][]=f[][];
for(int i=;i<=;++i)
for(int j=;j<=i;++j)
dp[i][j]=dp[i-][min(i-,j)]+f[i][j];
} int main(){
scanf("%d%d",&T,&k);
init();
while(T--){
scanf("%d%d",&n,&m);
if(m>n) m=n;
printf("%d\n",dp[n][m]);
}
return ;
}

luoguP2822-组合数问题(基础DP)的更多相关文章

  1. 基础dp

    队友的建议,让我去学一学kuangbin的基础dp,在这里小小的整理总结一下吧. 首先我感觉自己还远远不够称为一个dp选手,一是这些题目还远不够,二是定义状态的经验不足.不过这些题目让我在一定程度上加 ...

  2. 基础DP(初级版)

    本文主要内容为基础DP,内容来源为<算法导论>,总结不易,转载请注明出处. 后续会更新出kuanbin关于基础DP的题目...... 动态规划: 动态规划用于子问题重叠的情况,即不同的子问 ...

  3. hdu 5586 Sum 基础dp

    Sum Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Problem Desc ...

  4. hdu 4055 Number String (基础dp)

    Number String Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)To ...

  5. 训练指南 UVA - 10917(最短路Dijkstra + 基础DP)

    layout: post title: 训练指南 UVA - 10917(最短路Dijkstra + 基础DP) author: "luowentaoaa" catalog: tr ...

  6. 训练指南 UVA - 11324(双连通分量 + 缩点+ 基础DP)

    layout: post title: 训练指南 UVA - 11324(双连通分量 + 缩点+ 基础DP) author: "luowentaoaa" catalog: true ...

  7. 「kuangbin带你飞」专题十二 基础DP

    layout: post title: 「kuangbin带你飞」专题十二 基础DP author: "luowentaoaa" catalog: true tags: mathj ...

  8. M - 基础DP

    M - 基础DP Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Descriptio ...

  9. lightoj1004【基础DP】

    从低端到顶端求个最大值: 思路: 基础DP,递推 #include<cstdio> #include<queue> #include<map> #include&l ...

  10. hdu 4489 The King’s Ups and Downs(基础dp)

    The King’s Ups and Downs Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java ...

随机推荐

  1. 在Windows下编译扩展OpenCV 3.1.0 + opencv_contrib 及一些问题

    一.准备工作: 1.下载OpenCV安装包:https://github.com/opencv/opencv 安装过程实际上就是解压过程,安装完成后得到(这里修改了文件名): 2.下载opencv_c ...

  2. 查找:find、locate、which、whereis

    有find . locate . which . whereis 一.find 命令格式:[root@localhost ~]# find 搜索路径 [选项] 搜索内容 find是比较特殊的命令,它有 ...

  3. Rabbitmq的高级特性

    消息如何保证100%投递成功? 什么是生产端的可靠性投递? 1.保障消息的成功发出 2.保障MQ节点的成功接收 3.发送端收到MQ节点(Broker)确认应答 4.完善的消息补偿机制 BAT互联网大厂 ...

  4. Android_(消息提示)多种使用Toast的消息提示

    Toast是一种提供给用户简介信息的视图,可以创建和显示消息,该视图以浮于应用程序之上的形式呈现给用户.因为它并不获得焦点,即使用户正在输入什么也不会受到影响. Toast目标是尽可能以不显眼的方式, ...

  5. nagios监控部署

    nagios监控部署. 在部署之前把依赖包安装了. [root@tiandong63 ~]# yum install -y gcc glibc glibc-common php gd gd-devel ...

  6. 深入使用Vue + TS

    深入使用TS 支持 render jsx 写法 这里一共分两步 首先得先让 vue 支持 jsx 写法 再让 vue 中的 ts 支持 jsx 写法 让 vue 支持 jsx 按照官方做法,安装Bab ...

  7. python-numpy-1

    mean() mean() 函数定义: numpy.``mean(a, axis=None, dtype=None, out=None, keepdims=<class numpy._globa ...

  8. 开源!js实现微信/QQ直接跳转到支付宝APP打开口令领红包!附:demo

    最近支付宝的领红包可真是刷爆了各个微信群啊,满群都是支付宝口令. 可是这样推广可不是办法,又要复制又要打开支付宝又要点领取,太麻烦了. 于是乎,提出了一个疑问!是否可以在微信里面点一个链接然后直接打开 ...

  9. 解决分页插件ClassNotFoundException: org.springframework.boot.bind.RelaxedPropertyResolver

    org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'com.github.p ...

  10. *CodeIgniter框架集成支付宝即时到账SDK

    客户的网站需要支付功能,我们选择了业界用的最多的支付宝即时到账支付.申请了两次将近两周的时间终于下来了,于是我开始着手测试SDK整合支付流程. SDK中的代码并不复杂,就是构造请求发送,接收并验证签名 ...