Rockdu's Blog
“Where there is will, there is a way”
亲 您的浏览器不支持html5的audio标签
Toggle navigation
Rockdu's Blog
主页
数据结构
字符串算法
图论
数论、数学
动态规划
基础算法
[其它内容]
计算几何
科研笔记
归档
标签
洛谷P2822 组合数问题
? 解题记录 ?
? 洛谷 ?
? 组合数 ?
2018-10-09 08:20:02
405
0
0
rockdu
? 解题记录 ?
? 洛谷 ?
? 组合数 ?
题目描述 组合数 $C_n^m$ 表示的是从 $n$ 个物品中选出 $m$ 个物品的方案数。举个例子,从 (1,2,3) 三个物品中选择两个物品可以有 (1,2),(1,3),(2,3) 这三种选择方法。根据组合数的定义,我们可以给出计算组合数 $C_n^m$ 的一般公式: $C_n^m=\frac{n!}{m!(n-m)!}$ 其中 $n!=1\times2\times\cdots\times n$;特别地,定义 $0!=1$。 小葱想知道如果给定 $n,m$ 和 $k$,对于所有的 $0\leq i\leq n,0\leq j\leq \min (i, m )$ 有多少对 $(i,j)$ 满足 $C_i^j$ 是 $k$ 的倍数。 输入输出格式 输入格式: 第一行有两个整数 $t,k$,其中 $t$ 代表该测试点总共有多少组测试数据,$k$ 的意义见问题描述。 接下来 tt 行每行两个整数 $n,m$,其中 $n,m$ 的意义见问题描述。 输出格式: 共 tt 行,每行一个整数代表所有的 $0\leq i\leq n,0\leq j\leq \min (i, m )$ 中有多少对 $(i,j)$ 满足 $C_i^j$ 是 k 的倍数。 输入输出样例 输入样例#1: 1 2 3 3 输出样例#1: 1 输入样例#2: 2 5 4 5 6 7 输出样例#2: 0 7 模意义下$N^2$推组合数的板子,去掉一个前缀和操作就可以到处贴了。 ``` #include<cstdio> using namespace std; const int maxn = 2e3 + 5; int C[maxn][maxn], ans[maxn][maxn], mod, n, m, k; void Add(int &x, const int &a) { x += a; if(x >= mod) x -= mod; } void solve(int n, int k) { C[0][0] = 1, mod = k; for(register int i = 1; i <= n; ++i) { C[i][0] = 1; for(register int j = 1; j <= i; ++j) { Add(C[i][j], C[i - 1][j]), Add(C[i][j], C[i - 1][j - 1]); } } int sum = 0; for(register int i = 1; i <= n; ++i) { sum = 0; for(register int j = 0; j <= n; ++j) { if(j <= i) sum += !C[i][j]; ans[i][j] = ans[i - 1][j] + sum; } } } int main() { //freopen("t4.in", "r", stdin); //freopen("t4.out", "w", stdout); int t; scanf("%d%d", &t, &k); solve(2000, k); while(t--) { scanf("%d%d", &n, &m); printf("%d\n", ans[n][m]); } return 0; } ```
上一篇:
洛谷P3953 逛公园
下一篇:
小马恶魔城:题解与数据
0
赞
405 人读过
新浪微博
微信
腾讯微博
QQ空间
人人网
提交评论
立即登录
, 发表评论.
没有帐号?
立即注册
0
条评论
More...
文档导航
没有帐号? 立即注册