Solution -「Hdu3037」Saving Beans
Prob.
给定 \(m\) 个相同球,\(n\) 个不同的盒子。
求在这 \(n\) 个盒子中放不超过 \(m\) 个球的方案数,并对 \(p\) 取模。
其中 \(1 \leq n, m \leq 10^9, 1 < p < 10^6\),且 \(p\) 为质数。
Sol.
考虑先大力写出原题对应的组合数的柿子。
那就先来看一个经典模型:求 \(x\) 个不同盒子中放 \(y\) 个球允许盒子空着的方案数。
我们可以运用插板法。总共 \(y - 1\) 个空位,插入 \(x - 1\) 块板,这是不允许空着的方案。
我们可以尝试再给它额外分配 \(x\) 个空位,只要插到了这些空位里,就相当于当前分出的盒子取空。故该模型的答案即为 \(\dbinom {x + y - 1} {x - 1}\)。
不难发现原题就是在这个模型上又套了一个求和,即 \(x\) 固定但 \(y\) 不定。那么原题的答案即为 \({\large \sum \limits_ {i = 0} ^{m}} \dbinom {i + n - 1} {n - 1}\)。
恒等变换一下,即 \({\large \sum \limits_ {i = 0} ^{m + n - 1}} \dbinom {i} {n - 1}\)。
再由利用变上项求和公式可得 \({\large \sum \limits_ {i = 0} ^{m + n - 1}} \dbinom {i} {n - 1} = \dbinom {m + n} {n}\)。
现在我们就将其化为了简洁的一个组合数的形式,瓶颈在于 \(m, n\) 过大。
关于大数组合数的取模不难想到 Lucas ((。
Code.
#include <cstdio>
typedef long long LL;
int Abs(int x) { return x < 0 ? -x : x; }
int Max(int x, int y) { return x > y ? x : y; }
int Min(int x, int y) { return x < y ? x : y; }
int read() {
int x = 0, k = 1;
char s = getchar();
while(s < '0' || s > '9') {
if(s == '-')
k = -1;
s = getchar();
}
while('0' <= s && s <= '9') {
x = (x << 3) + (x << 1) + (s ^ 48);
s = getchar();
}
return x * k;
}
void write(int x) {
if(x < 0) {
x = -x;
putchar('-');
}
if(x > 9)
write(x / 10);
putchar(x % 10 + '0');
}
void print(int x, char s) {
write(x);
putchar(s);
}
const int MAXN = 1e5 + 5;
int fac[MAXN], inv[MAXN], mod;
int Quick_Pow(int a, int b) {
int res = 1;
while(b) {
if(b & 1)
res = (LL)res * a % mod;
a = (LL)a * a % mod;
b >>= 1;
}
return res;
}
int C(int n, int m) {
int res = 1;
for(int i = n - m + 1; i <= n; i++)
res = (LL)res * i % mod;
int down = 1;
for(int i = 2; i <= m; i++)
down = (LL)down * i % mod;
return (LL)res * Quick_Pow(down, mod - 2) % mod;
}
int Lucas(int n, int m) {
if(m < mod)
return C(n, m);
return (LL)Lucas(n / mod, m / mod) * C(n % mod, m % mod) % mod;
}
int main() {
int t = read();
while(t--) {
int n = read(), m = read();
mod = read();
print(Lucas(m + n, n), '\n');
}
return 0;
}
Solution -「Hdu3037」Saving Beans的更多相关文章
- Solution -「构造」专练
记录全思路过程和正解分析.全思路过程很 navie,不过很下饭不是嘛.会持续更新的(应该). 「CF1521E」Nastia and a Beautiful Matrix Thought. 要把所有数 ...
- Solution -「原创」Destiny
题目背景 题目背景与题目描述无关.签到愉快. 「冷」 他半靠在床沿,一缕感伤在透亮的眼眸间荡漾. 冷见惆怅而四散逃去.经历嘈杂喧嚣,感官早已麻木.冷又见空洞而乘隙而入.从里向外,这不是感官的范畴. 他 ...
- Solution -「GLR-R2」教材运送
\(\mathcal{Description}\) Link. 给定一棵包含 \(n\) 个点,有点权和边权的树.设当前位置 \(s\)(初始时 \(s=1\)),每次在 \(n\) 个结点内 ...
- Solution -「WF2011」「BZOJ #3963」MachineWorks
\(\mathcal{Description}\) Link. 给定你初始拥有的钱数 \(C\) 以及 \(N\) 台机器的属性,第 \(i\) 台有属性 \((d_i,p_i,r_i,g_i ...
- Solution -「LOCAL」二进制的世界
\(\mathcal{Description}\) OurOJ. 给定序列 \(\{a_n\}\) 和一个二元运算 \(\operatorname{op}\in\{\operatorname{ ...
- Solution -「SHOI2016」「洛谷 P4336」黑暗前的幻想乡
\(\mathcal{Description}\) link. 有一个 \(n\) 个结点的无向图,给定 \(n-1\) 组边集,求从每组边集选出恰一条边最终构成树的方案树.对 \(10^9+ ...
- Solution -「LOCAL」大括号树
\(\mathcal{Description}\) OurTeam & OurOJ. 给定一棵 \(n\) 个顶点的树,每个顶点标有字符 ( 或 ).将从 \(u\) 到 \(v\) ...
- Solution -「ZJOI2012」「洛谷 P2597」灾难
\(\mathcal{Description}\) link. 给定一个捕食网络,对于每个物种,求其灭绝后有多少消费者失去所有食物来源.(一些名词与生物学的定义相同 w.) 原图结点数 \ ...
- Solution -「JSOI2008」「洛谷 P4208」最小生成树计数
\(\mathcal{Description}\) link. 给定带权简单无向图,求其最小生成树个数. 顶点数 \(n\le10^2\),边数 \(m\le10^3\),相同边权的边数不 ...
随机推荐
- [论文] FRCRN:利用频率递归提升特征表征的单通道语音增强
本文介绍了ICASSP2022 DNS Challenge第二名阿里和新加坡南阳理工大学的技术方案,该方案针对卷积循环网络对频率特征的提取高度受限于卷积编解码器(Convolutional Encod ...
- Neo4j数据和Cypher查询语法笔记
Cypher数据结构 Cypher的数据结构: 属性类型, 复合类型和结构类型 属性类型 属性类型 Integer Float String: 'Hello', "World" B ...
- c++:-3
上一节学习了C++的函数:c++:-2,本节学习C++的数组.指针和字符串 数组 定义和初始化 定义 例如:int a[10]; 表示a为整型数组,有10个元素:a[0]...a[9] 例如: int ...
- MyCat 使用中问题记录
MyCat问题记录: Unknown charsetIndex:255 异常消息: jvm 1 | 2022-04-27 14:09:13,337 [WARN ][$_NIOREACTOR-13-RW ...
- 8.0 vue cli自定义页面
1.新建a.html(public文件夹下)文件,并设定div的id="a" <!DOCTYPE html> <html lang=""> ...
- unity---脚本创建按钮
脚本创建按钮 新建文件夹 Resources 方便引用图片 在文件Resources中新建Images,并且下载一个图片 没有图片,按钮内容无法显示 图片需要处理一下 Textrue Type 改为 ...
- 136_Power BI 自定义矩阵热力图
博客:www.jiaopengzi.com 焦棚子的文章目录 请点击下载附件 一.背景 在前几天在pbirs自定义登录后,发现一个问题就是非Power BI原生的视觉无法显示,改回AD登录又可以了.目 ...
- 记一次 JDK SPI 配置不生效的问题 → 这么简单都不会,还是回家养猪吧
开心一刻 今天去幼儿园接小侄女,路上聊起了天 小侄女:小叔,今天我吃东西被老师发现了 我:老师说了什么 小侄女:她说拿出来,跟小朋友一起分享 我:那你拿出来了吗 小侄女一脸可怜的看向我,说道:没有,我 ...
- Wget命令解释
Wget主要用于下载文件,在安装软件时会经常用到,以下对wget做简单说明. 1.下载单个文件:wget http://www.baidu.com.命令会直接在当前目录下载一个index.html的文 ...
- c++ 树状数组
关于树状数组 树状数组,即 Binary Indexed Tree ,主要用于维护查询前缀和 属于 log 型数据结构 和线段树比较 都是 log 级别 树状数组常数.耗费的空间.代码量都比线段树小 ...