AT5341 [ABC156D] Bouquet 题解
Content
有一个人有 \(n\) 种不同的话可供选择,TA 可以选择至少一种花做花束,但是 TA 不喜欢花的种数为 \(a\) 或者 \(b\) 的花束。求选花的方案数对 \(10^9+7\) 取模。
数据范围:\(2\leqslant n\leqslant 10^9\),\(1\leqslant a<b\leqslant\min\{n,2\times 10^5\}\)。
Solution
简单的数数题。
我们先抛开『TA 不喜欢花的种数为 \(a\) 或者 \(b\) 的花束』这个条件不管,先来看如果是从 \(n\) 种花中选至少一种花作为花束的方案数。很显然,每种花都有『选』或者『不选』这两种状态,那么就一共有 \(2^n\) 种方案。但是又不能全部都不选,于是最终方案总数为 \(2^n-1\)。
我们再来看看不选种数为 \(a\) 或者 \(b\) 的方案总数。根据组合数的定义,我们可以很快求出选花的种数为 \(a\) 的方案总数为 \(C_n^a\),选花的种数为 \(b\) 的方案总数为 \(C_n^b\),又因为题目保证 \(a\neq b\),因此选花的种数为 \(a\) 或者 \(b\) 的方案总数为 \(C_n^a+C_n^b\)。
那么,最终的答案就呼之欲出了,为 \(2^n-1-C_n^a-C_n^b\)。
那么我们该如何求出答案呢?
首先,\(2^n\) 这个部分非常好办,直接上快速幂即可。
再然后就是组合数了。我们不妨先看到费马小定理和乘法逆元的定义。
- 费马小定理:如果 \(p\) 是质数,则对于任意整数 \(a\),都有 \(a^p\equiv a\pmod p\),或者 \(a^{p-1}\equiv 1\pmod p\)。
- 乘法逆元:如果 \(b,p\) 互质,且 \(b\mid a\),则我们存在一个整数 \(x\),使得 \(\dfrac ab\equiv a\cdot x\pmod p\)。
有了这两个东西,我们可以推导出 \(a\times a^{p-2}\equiv 1\pmod p\),从而在计算组合数的时候就不用除一个数 \(x\),直接乘上 \(x^{p-2}\) 即可达到相同的效果。
回到求组合数,由于 \(C_n^m=\dfrac{n!}{m!((n-m)!}=\dfrac{\prod\limits_{i=n-m+1}^ni}{m!}\),因此我们可以分两部分暴力去算出分子 \(a\) 和分母 \(b\),组合数就是 \(a\times b^{mod-2}\)。
这道题目就算做完了。
Code
const int N = 2e5 + 7, mod = 1e9 + 7;
ii ksm(int a, int b) {
int res = 1;
for(; b; b >>= 1, a = 1ll * a * a % mod) if(b % 2) res = 1ll * res * a % mod;
return res;
}
ii C(int n, int m) {
if(n < m || n < 0 || m < 0) return 0;
int res1 = 1, res2 = 1;
R(int, i, n, n - m + 1) res1 = 1ll * res1 * i % mod;
R(int, i, m, 1) res2 = 1ll * res2 * i % mod;
return 1ll * res1 * ksm(res2, mod - 2) % mod;
}
int main() {
int n = Rint, a = Rint, b = Rint, ans = ksm(2, n) % mod;
ans = (((ans - C(n, a) + mod) % mod - C(n, b) + mod) % mod - 1 + mod) % mod;
return println(ans), 0;
}
AT5341 [ABC156D] Bouquet 题解的更多相关文章
- 2016 华南师大ACM校赛 SCNUCPC 非官方题解
我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...
- noip2016十连测题解
以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...
- BZOJ-2561-最小生成树 题解(最小割)
2561: 最小生成树(题解) Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1628 Solved: 786 传送门:http://www.lyd ...
- Codeforces Round #353 (Div. 2) ABCDE 题解 python
Problems # Name A Infinite Sequence standard input/output 1 s, 256 MB x3509 B Restoring P ...
- 哈尔滨理工大学ACM全国邀请赛(网络同步赛)题解
题目链接 提交连接:http://acm-software.hrbust.edu.cn/problemset.php?page=5 1470-1482 只做出来四道比较水的题目,还需要加强中等题的训练 ...
- 2016ACM青岛区域赛题解
A.Relic Discovery_hdu5982 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Jav ...
- poj1399 hoj1037 Direct Visibility 题解 (宽搜)
http://poj.org/problem?id=1399 http://acm.hit.edu.cn/hoj/problem/view?id=1037 题意: 在一个最多200*200的minec ...
- 网络流n题 题解
学会了网络流,就经常闲的没事儿刷网络流--于是乎来一发题解. 1. COGS2093 花园的守护之神 题意:给定一个带权无向图,问至少删除多少条边才能使得s-t最短路的长度变长. 用Dijkstra或 ...
- CF100965C题解..
求方程 \[ \begin{array}\\ \sum_{i=1}^n x_i & \equiv & a_1 \pmod{p} \\ \sum_{i=1}^n x_i^2 & ...
随机推荐
- 第08章 MySQL聚合函数
第08章 MySQL聚合函数 我们上一章讲到了 SQL 单行函数.实际上 SQL 函数还有一类,叫做聚合(或聚集.分组)函数,它是对一组数据进行汇总的函数,输入的是一组数据的集合,输出的是单个值. 1 ...
- UI自动化测试:App的WebView页面中,当搜索栏无搜索按钮时处理方法
一.遇到的问题 在做移动端的UI自动化测试时,经常会遇到上图所示的搜索框,这里有个麻烦就是搜索框没有"搜索"按钮,UI自动化测试时不能确认搜索. 要解决这个问题,我们可以通过 dr ...
- Golang进阶,揉碎数据库中间件,干货满满!
目录 必读 一.Centos7.Mac安装MySQL 二.主从复制原理 2.1.基于binlog_filename + position 2.2.基于GTID 三.my.cnf 四.测试SQL 五.中 ...
- 8.2 k8s 基于StatefulSet运行mysql 一主多从 ,数据通过pv/pvc结合NFS服务器持久化
1.准备mysql和xtrabackup镜像 下载mysql官方镜像并上传到本地harbor docker pull mysql:5.7 docker tag m ysql:5.7 192.168.1 ...
- 区分wsgi、uWSGI、uwsgi、php-fpm、CGI、FastCGI
在学习Python web开发时候,可能会遇到诸如uwsgi,wsgi等名词,下面通过梳理总结探究它们之间的关系. CGI CGI,(Common Gateway Interface)通用网关接口,是 ...
- Docker 外部访问容器Pp、数据管理volume、网络network 介绍
Docker 外部访问容器Pp.数据管理volume.网络network 介绍 外部访问容器 容器中可以运行一些网络应用,要让外部也可以访问这些应用,可以通过 -P 或 -p 参数来 指定端口映射. ...
- ubuntu常见错误--Could not get lock /var/lib/dpkg/lock
ubuntu常见错误--Could not get lock /var/lib/dpkg/lock 通过终端安装程序sudo apt-get install xxx时出错: E: Could ...
- 21-Add Two Numbers-Leetcode
You are given two linked lists representing two non-negative numbers. The digits are stored in rever ...
- 在前端页面中使用Markdown并且优化a标签
近期在自己的项目中加入了对 Markdown 语法 的支持,主要用到的是markedjs这个项目.该项目托管在github上,地址为:https://github.com/markedjs/marke ...
- C/C++运行时确定字节顺序
字节顺序(英文:Endianness),多字节数据在内存中的存储顺序: 1.对于特定数据,内存空间有起始地址.结束地址: 2.对于数据本身,存在高位字节.地位字节:例如 int data = 0x01 ...