NOIP2016 D2T1 组合数问题
数学真重要啊……
其实解这一题的关键就是组合恒等式:C(n,m)=C(n-1,m)+C(n-1,m-1),然后再知道组合数的矩阵(杨辉三角)和题中n,m的关系就很容易解决了(然而做这题之前我并不知道组合恒等式于是杯具了)
由上文提到的几何恒等式,我们可以将组合数打成如下矩阵(C(i,j)行数代表i,列数代表j(均从0开始))
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
………………
接下来我们来看要求的结论:求所有的0≤i≤n,0≤j≤min(i,m)中有多少对(i,j)使C(i,j)是k的倍数。
我乍一看到min(i,m)以为这题很复杂。但放到图中一看,想到i≥j,我们惊奇地发现,我们要求的结论就是图中共n+1行,m+1列(包括i=0,j=0)中有多少组合数是k的倍数。
画个图给大家感受一下(灵魂画手)
比如n=3,m=2,那我们就是要求图中这个部分组合数是k的倍数的数量

但询问量特别大,所以我们可以预处理一下
每访问到一个元素都枚举一个矩形很慢,但我们有递推式:d[i][j]=d[i-1][j]+d[i][j-1]-d[i-1][j-1]+!(zuhe[i][j]%k)
拿上面那个矩阵举例子

黑色部分的信息(被k整除的组合数个数)d[3][2]可以表示为红色部分的信息d[2][2]加上绿色部分的信息d[3][1]减去蓝色部分的信息d[2][1](此信息满足区间加法和减法性质)
事实上因为c++数组自动初始化为0的问题,所以我们只会初始化有组合数部分的d值(即i≥j),那么m<n的时候怎么办呢?

很显然图中黑色部分的信息等于红色部分的信息(因为组合数数量相等)
所以当m<n时d[m][n]=d[m][m](在递推的时候处理或是在输出的时候处理均可,我是在输出的时候处理的)
另外此处递推的时候注意一下边界问题(i=j时),此时d[i-1][j]我们没有更新(因为i-1<j),所以此时的d[i][j]=d[i][j-1]+!(zuhe[i][j]%k)

即黑色部分的信息等于红色部分的信息加上当前点的信息
还有一点小tip就是2000个组合数会很大,所以我们递推组合数的时候就将它模k,这样模k=0的组合数在表中的值就是0,上面的递推公式就改为:d[i][j]=d[i-1][j]+d[i][j-1]-d[i-1][j-1]+!zuhe[i][j](i>j),d[i][i]=d[i][i-1]+!zuhe[i][i]
剩下的就很简单了,记得初始化zuhe[1][0]=zuhe[1][1]=1即可
代码如下:
#include<cstdio>
using namespace std;
int t,k,n,m;
int zuhe[][];//存储组合数(%k意义下)
int d[][];//存储方案个数
int main()
{
scanf("%d%d",&t,&k);
zuhe[][]=zuhe[][]=;//初始化C(1,0)=C(1,1)=1
for(int i=;i<=;i++)
for(int j=;j<=i;j++)
zuhe[i][j]=(zuhe[i-][j]+zuhe[i-][j-])%k;
for(int i=;i<=;i++)
{
for(int j=;j<i;j++)
d[i][j]=d[i-][j]+d[i][j-]-d[i-][j-]+!zuhe[i][j];
d[i][i]=d[i][i-]+!zuhe[i][i];
}
while(t--)
{
int n,m;
scanf("%d%d",&n,&m);
if(n<m)
m=n;
printf("%d\n",d[n][m]);
}
return ;
}
NOIP2016 D2T1 组合数问题的更多相关文章
- CJOJ 2255 【NOIP2016】组合数问题 / Luogu 2822 组合数问题 (递推)
CJOJ 2255 [NOIP2016]组合数问题 / Luogu 2822 组合数问题 (递推) Description 组合数\[C^m_n\]表示的是从n个物品中选出m个物品的方案数.举个例子, ...
- 题解 【NOIP2016】组合数问题
[NOIP2016]组合数问题 Description Input 第一行有两个整数t, k,其中t代表该测试点总共有多少组测试数据,k的意义见[问题描述]. 接下来t行每行两个整数n, m,其中n, ...
- UOJ263 【NOIP2016】组合数问题
本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000作者博客:http://www.cnblogs.com/ljh2000-jump/转 ...
- NOIP2016 D2T1 組合數問題(problem)
题目描述 组合数C(n,m)表示的是从n个物品中选出m个物品的方案数.举个例子,从(1,2,3) 三个物品中选择两个物品可以有(1,2),(1,3),(2,3)这三种选择方法.根据组合数的定 义,我们 ...
- 【NOIP2016】组合数问题 题解(组合数学+递推)
题目链接 题目大意:给定$n,m,k$,求满足$k|C_i^j$的$C_i^j$的个数.$(0\leq i\leq n,1\leq j\leq \min(i,m))$. --------------- ...
- 【NOIP2016】组合数问题
写着玩玩…… 反正超级sb题. #include<bits/stdc++.h> typedef long long ll; using namespace std; ll c[][],h[ ...
- 【NOIP2016】 组合数问题
[题目链接] 点击打开链接 [算法] 杨辉三角 + 二维前缀和 O(1)计算答案 [代码] #include<bits/stdc++.h> using namespace std; #de ...
- $Noip2016/Luogu2822$ 组合数问题
$Luogu$ 看这题题解的时候看到一个好可爱的表情(●'◡'●)ノ♥ $Sol$ 首先注意到这题的模数是$k$.然而$k$并不一定是质数,所以不能用$C_n^m=\frac{n!}{m!(n-m)! ...
- 组合数取模及Lucas定理
引入: 组合数C(m,n)表示在m个不同的元素中取出n个元素(不要求有序),产生的方案数.定义式:C(m,n)=m!/(n!*(m-n)!)(并不会使用LaTex QAQ). 根据题目中对组合数的需要 ...
随机推荐
- vs2010 setup 打包 安装 BAT批处理实现自动安装软件功能
CLS@echo offECHO.ECHO 安装 Diskeeper 7.0.428ECHO 请稍等...start /wait %systemdrive%\install\Applications\ ...
- windows7如何用键盘模拟鼠标操作
windows7如何用键盘模拟鼠标操作 https://jingyan.baidu.com/article/6dad5075104907a123e36e38.html 听语音 37453人看了这个视频 ...
- 中国MOOC_零基础学Java语言_第5周 数组
第5周 数组 5.1 数组 5.2 数组计算 public class Main { public static void main(String[] args) { for (int i = 1; ...
- 中国MOOC_零基础学Java语言_第4周 循环控制_2念整数
2 念整数(5分) 题目内容: 你的程序要读入一个整数,范围是[-100000,100000].然后,用汉语拼音将这个整数的每一位输出出来. 如输入1234,则输出: yi er san si 注意, ...
- IntelliJ IDEA 2019.1.1 maven框架web.xml中web-app版本过低导致不能正常使用EL表达式的解决方案
1.软件版本 IDEA版本:IntelliJ IDEA 2019.1.1 maven版本:apache-maven-3.6.1 Tomcat版本:tomcat-8.5 2.问题描述 IDEA使用如下 ...
- 精读《Optional chaining》
1. 引言 备受开发者喜爱的特性 Optional chaining 在 2019.6.5 进入了 stage2,让我们详细读一下草案,了解一下这个特性的用法以及讨论要点. 借着这次精读草案,让我们了 ...
- IDEA神器
破解 路径:添加-javaagent:JetbrainsCrack-2.7-release-str.jar的路径 例-javaagent:D:\Program Files\JetBrains\Inte ...
- CentOS7配置NFS网络文件系统
NFS,是Network File System的简写,即网络文件系统.网络文件系统是FreeBSD支持的文件系统中的一种,也被称为NFS. NFS允许一个系统在网络上与他人共享目录和文件.通过使用N ...
- 【Linux-驱动】驱动策略----信号量
访问共享资源的代码区块叫“临界区”,临界区需要以某种互斥机制加以保护:自旋锁.信号量等.互斥访问:一个执行单元在访问共享资源的时候,其他的执行单元被禁止访问. 信号量:在Liunx中的信号量是一种睡眠 ...
- Windows系统里Oracle 11g R2 Client(64bit)的下载与安装
环境: windows10系统(64位) 最好先安装jre或jdk(此软件用来打开oracle自带的可视化操作界面,不装也没关系:可以安装plsql,或者直接用命令行操作) Oracle 11g 是仅 ...