luoguP2822-组合数问题(基础DP)
题目链接: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)的更多相关文章
- 基础dp
队友的建议,让我去学一学kuangbin的基础dp,在这里小小的整理总结一下吧. 首先我感觉自己还远远不够称为一个dp选手,一是这些题目还远不够,二是定义状态的经验不足.不过这些题目让我在一定程度上加 ...
- 基础DP(初级版)
本文主要内容为基础DP,内容来源为<算法导论>,总结不易,转载请注明出处. 后续会更新出kuanbin关于基础DP的题目...... 动态规划: 动态规划用于子问题重叠的情况,即不同的子问 ...
- hdu 5586 Sum 基础dp
Sum Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Problem Desc ...
- hdu 4055 Number String (基础dp)
Number String Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)To ...
- 训练指南 UVA - 10917(最短路Dijkstra + 基础DP)
layout: post title: 训练指南 UVA - 10917(最短路Dijkstra + 基础DP) author: "luowentaoaa" catalog: tr ...
- 训练指南 UVA - 11324(双连通分量 + 缩点+ 基础DP)
layout: post title: 训练指南 UVA - 11324(双连通分量 + 缩点+ 基础DP) author: "luowentaoaa" catalog: true ...
- 「kuangbin带你飞」专题十二 基础DP
layout: post title: 「kuangbin带你飞」专题十二 基础DP author: "luowentaoaa" catalog: true tags: mathj ...
- M - 基础DP
M - 基础DP Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Descriptio ...
- lightoj1004【基础DP】
从低端到顶端求个最大值: 思路: 基础DP,递推 #include<cstdio> #include<queue> #include<map> #include&l ...
- 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 ...
随机推荐
- jquery fadeIn()方法 语法
jquery fadeIn()方法 语法 作用:fadeIn() 方法使用淡入效果来显示被选元素,假如该元素是隐藏的.大理石平台检定规程 语法:$(selector).fadeIn(speed,cal ...
- CSS3 box-sizing:content-box | border-box
box-sizing:content-box | border-box 默认值:content-box 适用于:所有接受width和height的元素 继承性:无 content-box: paddi ...
- CDOJ 1255 斓少摘苹果 图论 2016_5_14
斓少摘苹果 Time Limit: 3000/3000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) Submit St ...
- JavaWeb_(Struts2框架)Ognl小案例查询帖子
此系列博文基于同一个项目已上传至github 传送门 JavaWeb_(Struts2框架)Struts创建Action的三种方式 传送门 JavaWeb_(Struts2框架)struts.xml核 ...
- Jmeter -- 对并发认识的误区
1. 误区 如下图所示,并发数设置为1000,启动时间设置1s,就是每秒发起1000个请求(错误) 上述的设置,表示在1s内启动1000个线程,之后,jmeter便以最大限度的1000个并发进行压测, ...
- HTTP服务器(2)
import socket import re import multiprocessing def service_client(new_socket): """为这个 ...
- 【译】OkHttp3 拦截器(Interceptor)
一,OkHttp 拦截器介绍(译自官方文档) 官方文档:https://github.com/square/okhttp/wiki/Interceptors 拦截器是 OkHttp 提供的对 Http ...
- TCP层recvmsg系统调用的实现分析
概述 recvmsg系统调用在tcp层的实现是tcp_recvmsg函数,该函数完成从接收队列中读取数据复制到用户空间的任务:函数在执行过程中会锁定控制块,避免软中断在tcp层的影响:函数会涉及从接收 ...
- 数据解析框架之FastJson
演示实体类 import java.util.List; public class Student { public String name; public int age; public List& ...
- shell案例(6):1、创建用户 2、创建目录 3、创建文件 4、退出
脚本基本要求 1.创建用户2.创建目录3.创建文件4.退出 #!/bin/bash #author:zhiping.wang Check_error() { ] then echo "$1 ...