https://www.luogu.org/problemnew/show/P2822(题目传送)

先了解一下有关组合数的公式:(m在上,n在下)

组合数通项公式:C(n,m)=n!/[m!(n-m)!]=(n-m+1)!/m!

组合数递推公式:C(n,m)=C(n-1,m-1)+C(n-1,m)

发现组合数的递推的直观图像形式就是杨辉三角(第i行第j列的数等于C(i-1,j-1))

由于题目要求多组组合数,便可以递推组合数做预处理(直接用通项公式算什么的太粗暴(慢)了)。一看数据范围,保证让普通范围溢出的节奏啊,但定心一看,我们只用知道每个组合数是否能整除k就可,所以可以每次递推算组合数时模k。  TIP:递推不要忘了初始状态(边界)

求出组合数后,发现如果对每次询问都从头到尾扫一遍的话保准会超时,便想到了一个能有效减少查询统计时的复杂度,每一次查询O(n)降到O(1)的神器——前缀和。求一个矩阵的前缀和,只要记住公式:上加左,减上左,加自己。

AC代码如下:

 #include<iostream>
#include<cstdio>
using namespace std;
int c[][],n[],m[],dp[][];
int main()
{
int t,k,mmax=,nmax=;
cin>>t>>k;
for(int i=;i<=t;i++)
{
scanf("%d%d",&n[i],&m[i]);
if(nmax<n[i]) nmax=n[i];
if(mmax<m[i]) mmax=m[i];
}
c[][]=;
int mmaxb=mmax;
if(mmax>nmax) mmax=nmax+;
else mmax++;
for(int i=;i<=nmax+;i++)
for(int j=;j<=min(i,mmax);j++)
{
c[i][j]=(c[i-][j-]+c[i-][j])%k;
if(!c[i][j]) dp[i-][j-]=;
}//这里用杨辉三角递推的组合数,***需要多做一行***,其实没有直接推组合数方便。
for(int j=;j<=mmaxb;j++) dp[][j]+=dp[][j-];
for(int i=;i<=nmax;i++)
for(int j=;j<=mmaxb;j++)
{
if(!j) dp[i][j]+=dp[i-][j];
else
dp[i][j]+=dp[i-][j]+dp[i][j-]-dp[i-][j-];
}
for(int i=;i<=t;i++) cout<<dp[n[i]][m[i]]<<endl;
return ;
}

最新文章

  1. 51Nod-1136 欧拉函数
  2. Python验证码6位自动生成器
  3. matlab列优先与高维矩阵重构 及 CNN 逐层可视化 on Matlab
  4. “ORA-01033:ORACLE initialization or shutdown in progress”错误的解决
  5. JAVA获取CLASSPATH路径
  6. JAVA通过md5方法进行加密
  7. Ubuntu 14.04(32位)安装Oracle 11g(32位)全过程
  8. mysql源码:关于innodb中两次写的探索
  9. Given a binary tree and a sum, determine if the tree has a root-to-leaf path such that adding up all the values along the path equals the given sum. For example: Given the below binary tree andsum =
  10. 【leetcode❤python】 112. Path Sum
  11. JQuery Highcharts图表控件多样式显示多组数据
  12. EF调用存储过程
  13. WinCmd
  14. css3 动画运动路径
  15. find查找大于1M小于10M的文件 $ find . -size +1M -size -10M
  16. liunx下常见的命令汇总
  17. mybatis与spring的整合(使用接口实现crud)
  18. vue.js 视频教程
  19. leetcode3
  20. hdu 1242 找到朋友最短的时间 (BFS+优先队列)

热门文章

  1. MySQL 基础知识梳理学习(一)----系统数据库
  2. c/c++ linux epoll系列2 利用epoll_wait查看是否可以送信
  3. 如何在 windows server 2008 上面 挂载NFS
  4. docker容器日志收集方案(方案四,目前使用的方案)
  5. Java操作Excel(使用POI)
  6. linux安装成功后怎么调出终端
  7. jquery中数组对象下面的属性名名是动态的如何获取
  8. 文本分类实战(七)—— Adversarial LSTM模型
  9. 货车运输-洛谷-1967-LCA+最大生成树(kruskal(并查集))
  10. JDK1.8源码(八)——java.util.HashSet 类