[Noip2016]组合数(数论)
题目描述
组合数表示的是从n个物品中选出m个物品的方案数。举个例子,从(1,2,3) 三个物品中选择两个物品可以有(1,2),(1,3),(2,3)这三种选择方法。根据组合数的定 义,我们可以给出计算组合数的一般公式:

其中n! = 1 × 2 × · · · × n
小葱想知道如果给定n,m和k,对于所有的0 <= i <= n,0 <= j <= min(i,m)有多少对 (i,j)满足是k的倍数。
输入输出格式
输入格式:
第一行有两个整数t,k,其中t代表该测试点总共有多少组测试数据,k的意义见 【问题描述】。
接下来t行每行两个整数n,m,其中n,m的意义见【问题描述】。
输出格式:
t行,每行一个整数代表答案。
输入输出样例
输入样例#1:
1 2
3 3
输出样例#1:
1
输入样例#2:
2 5
4 5
6 7
输出样例#2:
0
7
说明
【样例1说明】
在所有可能的情况中,只有是2的倍数。
【子任务】

可以发现k是先给出的且不会变,想到先预处理出所有的答案
我们知道C(i,j)=C(i-1,j)+C(i-1,j-1),先用O(n^2)处理所有C[i][j]并取模
取b[i][j]表示c[i][j]是否能整除k,判断取模后是否为0即可
设f[i][[j]为对应的n=i,m=j的答案,分析f[i][j]的递推关系
其实打个表就容易找到规律,这里f[i][j]=C[i-1][j]+C[i][j-1]+C[i-1][j-1]+b[i][j]
代码如下,
#include <cstdio>
#include <cstring>
#define N 2020
int T, k, n, m;
int f[N][N];
bool b[N][N];
inline int read()
{
int x = 0, f = 1; char ch = getchar();
while (ch < '0' || ch > '9') {if (ch == '-')f = -1; ch = getchar();}
while (ch >= '0' && ch <= '9') {x = x * 10 + ch - '0'; ch = getchar();}
return x * f;
}
int main()
{
T = read(), k = read();
for (int i = 1; i <= N; ++i)
{
f[i][1] = i % k;
f[i][i] = 1;
}
for (int i = 3; i <= 2000; ++i)
for (int j = 2; j <= i - 1; ++j)
f[i][j] = (f[i - 1][j] + f[i - 1][j - 1]) % k;
for (int i = 1; i <= 2000; ++i)
for (int j = 1; j <= i; ++j)
if (!f[i][j]) b[i][j] = 1;
memset(f, 0, sizeof(f));
for (int i = 1; i <= 2000; ++i)
for (int j = 1; j <= 2000; ++j)
f[i][j] = f[i - 1][j] + f[i][j - 1] - f[i - 1][j - 1] + b[i][j];
while (T--)
{
n = read(), m = read();
printf("%d\n", f[n][m]);
}
return 0;
}
[Noip2016]组合数(数论)的更多相关文章
- Noip2016组合数(数论)
题目描述 组合数表示的是从n个物品中选出m个物品的方案数.举个例子,从(1,2,3) 三个物品中选择两个物品可以有(1,2),(1,3),(2,3)这三种选择方法.根据组合数的定 义,我们可以给出计算 ...
- Luogu 2822[NOIP2016] 组合数问题 - 数论
题解 乱搞就能过了. 首先我们考虑如何快速判断C(i, j ) | k 是否成立. 由于$k$非常小, 所以可以对$k$分解质因数, 接着预处理出前N个数的阶乘的因数中 $p_i$ 的个数, 然后就可 ...
- Bzoj 1856: [Scoi2010]字符串 卡特兰数,乘法逆元,组合数,数论
1856: [Scoi2010]字符串 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 1194 Solved: 651[Submit][Status][ ...
- 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) 三个物品中选择两个物品可以 ...
- 2559. [NOIP2016]组合数问题
[题目描述] [输入格式] 从文件中读入数据. 第一行有两个整数t, k,其中t代表该测试点总共有多少组测试数据,k的意义见[问题描述]. 接下来t行每行两个整数n, m,其中n, m的意义见[问题描 ...
- [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等 ...
随机推荐
- Razor 语法糖常规用法
1.隐匿代码表达式 例: @model.name 会将表达式的值计算并写入到响应中,输入时采用html编码方式 2.显示表达式 例:@(model.name)会将输入@model.name字符串 3. ...
- 学习lucene5.5.4的笔记
说说几个常用的类. OpenMode是一个枚举类,有三个元素,分别表示IndexWriter的打开模式. CREATE:每次打开IndexWriter时清空当前索引目录下的索引,再新建索引. APPE ...
- 2.eclipse安装
1.进入官网https://www.eclipse.org/ 2.配置工作目录:存放 1.项目代码 2.IDE相关配置信息 3.没有配置tomcat,所以为空.
- UITabBarController动态添加TabBarItem
NSArray *titles = @[L(@"首页"), L(@"新闻"), L(@"消息"), L(@"我的")]; ...
- 笨办法学Python(二十二)
习题 22: 到现在你学到了哪些东西? 这节以及下一节的习题中不会有任何代码,所以也不会有习题答案或者加分习题.其实这节习题可以说是一个巨型的加分习题.我将让你完成一个表格,让你回顾你到现在学到的所有 ...
- javascript中的循环引用对象处理
先说明一下什么是循环引用对象: var a={"name":"zzz"}; var b={"name":"vvv"}; ...
- jQuery获取Select选择的Text和Value[转载]
语法解释:1. $("#select_id").change(function(){//code...}); //为Select添加事件,当选择其中一项时触发2. var ch ...
- UVA-147 Dollars---完全背包+打表
题目链接: https://vjudge.net/problem/UVA-147 题目大意: 给定11种面值分别为$100, $50, $20, $10, and $5 notes and $2, $ ...
- 【转】Xcode真机测试could not find developer disk image解决方法
在使用Xcode进行真机调试的时候,有时根据真机的系统不同,会出现could not find developer disk image 错误,这是由于真机系统过高或者过低,Xcode中没有匹配的配置 ...
- Thinkphp 5 使用DOMDocument
每一个载入浏览器都会生成一个 Document 对象. Document 对象使我们可以从脚本中对 HTML 页面中的所有元素进行访问.Document 对象是 Window 对象的一部分. 我们项目 ...