UOJ263 【NOIP2016】组合数问题
本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作。
本文作者:ljh2000
作者博客:http://www.cnblogs.com/ljh2000-jump/
转载请注明出处,侵权必究,保留最终解释权!
题目描述
组合数 CmnCnm 表示的是从 nn 个物品中选出 mm 个物品的方案数。举个例子,从 (1,2,3)(1,2,3) 三个物品中选择两个物品可以有 (1,2),(1,3),(2,3)(1,2),(1,3),(2,3) 这三种选择方法。根据组合数的定义,我们可以给出计算组合数 CmnCnm 的一般公式:
其中 n!=1×2×⋯×nn!=1×2×⋯×n;特别地,定义 0!=10!=1。
小葱想知道如果给定 n,mn,m 和 kk,对于所有的 0≤i≤n,0≤j≤min(i,m)0≤i≤n,0≤j≤min(i,m) 有多少对 (i,j)(i,j) 满足 CjiCij 是 kk 的倍数。
输入格式
从标准输入读入数据。
第一行有两个整数 t,kt,k,其中 tt 代表该测试点总共有多少组测试数据,kk 的意义见问题描述。
接下来 tt 行每行两个整数 n,mn,m,其中 n,mn,m 的意义见问题描述。
输出格式
输出到标准输出。
tt 行,每行一个整数代表所有的 0≤i≤n,0≤j≤min(i,m)0≤i≤n,0≤j≤min(i,m) 中有多少对 (i,j)(i,j) 满足 CjiCij 是 kk 的倍数。
样例一
input
1 2
3 3
output
1
explanation
在所有可能的情况中,只有 C12=2C21=2 是 22的倍数。
样例二
input
2 5
4 5
6 7
output
0
7 正解:矩阵前缀和+组合数学
解题报告:
这是一道很简单的数学题,可以发现其实如果根据组合中的一个基本公式:C(n,m)=C(n-1,m)+C(n-1,m-1),就可以直接递推出2000以内的所有的组合数。而我们只需要判断有多少个点对满足是k的倍数,很容易想到只要对k取模,对于为0的C(i,j)是肯定满足是k的倍数的。
因为k是所有询问共用的,可以一开始就预处理出矩阵前缀和,之后每次O(1)查询就可以了。
注意事项:
很多人在考场上写的是质因数分解,但是很明显有一些k并不是质数,所以并不能直接分解,应该先对k进行质因数分解,在对于这些质因数在递推中分析。
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <string>
#include <ctime>
#include <queue>
#include <vector>
#include <cstdlib>
using namespace std;
typedef long long LL;
const int MAXN = ;
int T,k,n,m,ans;
int C[MAXN][MAXN],a[MAXN][MAXN];
int sum[MAXN][MAXN]; void work(){
scanf("%d%d",&T,&k);
C[][]=C[][]=;
for(int i=;i<=;i++){
C[i][]=;
for(int j=;j<=i;j++) {
C[i][j]=C[i-][j-]+C[i-][j];
C[i][j]%=k;
if(C[i][j]==) {
a[i][j]=;
}
}
}
for(int i=;i<=;i++)
for(int j=;j<=;j++)
sum[i][j]=sum[i-][j]+sum[i][j-]-sum[i-][j-]+a[i][j]; while(T--) {
scanf("%d%d",&n,&m); m=min(m,n);
printf("%d\n",sum[n][m]);
}
} int main()
{
work();
return ;
}
UOJ263 【NOIP2016】组合数问题的更多相关文章
- Noip2016组合数(数论)
题目描述 组合数表示的是从n个物品中选出m个物品的方案数.举个例子,从(1,2,3) 三个物品中选择两个物品可以有(1,2),(1,3),(2,3)这三种选择方法.根据组合数的定 义,我们可以给出计算 ...
- noip2016组合数问题
题目描述 组合数 Cnm 表示的是从 n 个物品中选出 m 个物品的方案数.举个例子,从 (1,2,3) 三个物品中选择两个物品可以有(1,2),(1,3),(2,3) 这三种选择方法.根据组合数的 ...
- NOIP2016 组合数问题
https://www.luogu.org/problem/show?pid=2822 题目描述 组合数表示的是从n个物品中选出m个物品的方案数.举个例子,从(1,2,3) 三个物品中选择两个物品可以 ...
- [Noip2016]组合数(数论)
题目描述 组合数表示的是从n个物品中选出m个物品的方案数.举个例子,从(1,2,3) 三个物品中选择两个物品可以有(1,2),(1,3),(2,3)这三种选择方法.根据组合数的定 义,我们可以给出计算 ...
- 2559. [NOIP2016]组合数问题
[题目描述] [输入格式] 从文件中读入数据. 第一行有两个整数t, k,其中t代表该测试点总共有多少组测试数据,k的意义见[问题描述]. 接下来t行每行两个整数n, m,其中n, m的意义见[问题描 ...
- Luogu 2822[NOIP2016] 组合数问题 - 数论
题解 乱搞就能过了. 首先我们考虑如何快速判断C(i, j ) | k 是否成立. 由于$k$非常小, 所以可以对$k$分解质因数, 接着预处理出前N个数的阶乘的因数中 $p_i$ 的个数, 然后就可 ...
- [noip2016]组合数问题<dp+杨辉三角>
题目链接:https://vijos.org/p/2006 当时在考场上只想到了暴力的做法,现在自己看了以后还是没思路,最后看大佬说的杨辉三角才懂这题... 我自己总结了一下,我不能反应出杨辉三角的递 ...
- NOIP 2016 组合数问题
洛谷 P2822 组合数问题 洛谷传送门 JDOJ 3139: [NOIP2016]组合数问题 D2 T1 JDOJ传送门 Description 组合数Cnm表示的是从n个物品中选出m个物品的方案数 ...
- noip 2016提高组D2T1 problem
我们可以先预处理一下组合数模K的值,然后我们可以发现对于答案ji[n][m],可以发现递推式ji[i][j]=ji[i-1][j]+ji[i][j-1]-ji[i-1][j-1]并对于Cij是否%k等 ...
- OI 刷题记录——每周更新
每周日更新 2016.05.29 UVa中国麻将(Chinese Mahjong,Uva 11210) UVa新汉诺塔问题(A Different Task,Uva 10795) NOIP2012同余 ...
随机推荐
- GridView EmptyDataTemplate 动态显示
以下语句加在GridView.DataBind()之后: Table GridViewTable = ((Table)gvGridView.Controls[]); if (!isSearch) (( ...
- ext 自带搜索功能
- QQ浏览器X5内核问题汇总
原文:http://itindex.net/detail/53391-qq-浏览器-x5 常常被人问及微信中使用的X5内核的问题,其实我也不是很清楚,只知道它是基于android 4.2的webkit ...
- 牛X的CSS3
See the Pen Dot Wave by Rich Howell (@roborich) on CodePen
- Qt中的qreal
在桌面操作系统中(比如Windows, XNix等)qreal其实就是double类型:而在嵌入设备系统中,qreal则等同于float 类型.
- ASP.NET 系列:单元测试
单元测试可以有效的可以在编码.设计.调试到重构等多方面显著提升我们的工作效率和质量.github上可供参考和学习的各种开源项目众多,NopCommerce.Orchard等以及微软的asp.net m ...
- JVM内存管理------GC算法精解(五分钟让你彻底明白标记/清除算法)
相信不少猿友看到标题就认为LZ是标题党了,不过既然您已经被LZ忽悠进来了,那就好好的享受一顿算法大餐吧.不过LZ丑话说前面哦,这篇文章应该能让各位彻底理解标记/清除算法,不过倘若各位猿友不能在五分钟内 ...
- Matlab生成M序列的伪随机码
伪随机编码中较常用的是m序列,它是线性反馈移位寄存器序列的一种,其特点是在相同寄存器级数的情况下输出序列周期最长.线性反馈移位寄存器的工作原理是,给定所有寄存器一个初始值,当移位脉冲到来时,将最后一级 ...
- 获取用户请求过来的URL
document.referer 一段JS搞定
- 如何在word中的第3+n页处插入页面并重新从1开始
在插入页码时有时可能会遇到这种情况: word的第一页是文档名称 第二页是目录 第三页才开始是正文,而我们希望看到页码从第三页开始才是第1页. 在第三页的开头,插入分隔符“下一页”,如果office2 ...