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 ...
随机推荐
- JavaScript算术运算符
㈠运算符(操作符) ⑴通过运算符可以对一个或多个值进行运算,并获取运算结果 ⑵比如:typeof就是运算符,可以来获得一个值得类型 它会将该值的类型以字符串的形式返回 ...
- js文件下载
因为公司后端忙得无法给批量下载的api,就我们前端自己把多张图片打包成zip下载,zip打包我们用的是jszip,下面是js实现下载的三种方法: 利用HTML download 属性 var a = ...
- 打开图像文件失败汇总:“Could not load image... ...0x## 0x##”错误
造冰箱的熊猫@cnblogs 2018/12/15 在Ubuntu上使用Image Viewer打开图片文件时,有时会遇到“Could not load image '001.jpg'. Error ...
- hdu 5533 正n边形判断 精度处理
Dancing Stars on Me Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Ot ...
- 牛客网 Wannafly挑战赛3 B.遇见
遇见 时间限制:C/C++ 1秒,其他语言2秒空间限制:C/C++ 65536K,其他语言131072K64bit IO Format: %lld 题目描述 A和B在同一条路上,他们之间的距离为 k ...
- SQL语句中 NOT IN 子句的“正确打开方式”
在写SQL语句的时候,若where条件是判断用户不在某个集合当中,我们习惯使用 where 列名 not in (集合) 子句,这种写法本身没有问题,但实践过程中却发现很多人在写类似的SQL语句时,写 ...
- Inter IPP+ VS + opencv 在 Windows下的环境搭建
首先Inter官网申请和下载:https://software.intel.com/en-us/intel-ipp 需要VS2013或更高版本(先装vs再装IPP,我的版本是VS2015社区版,IPP ...
- 对HTML中P标签的思考
这几天在用VUE-CLI做一个demo,然后在渲染一个列表的时候遇到了一个挺不可思议的事情: <!--这只是一小部分,v-for的内容在上方--> <div class=" ...
- linux安装mysql以及修改密码和重启mysql等相关命令
Linux/UNIX 上安装 MySQL Linux平台上推荐使用RPM包来安装Mysql,MySQL AB提供了以下RPM包的下载地址: MySQL - MySQL服务器.你需要该选项,除非你只想连 ...
- JS基础_break跳出外层循环
可以为循环语句创建一个label,来表示当前循环 label:循环语句 使用break语句时,可以在break后跟着一个label 这样break会结束指定的循环 outer: for(let i=0 ...