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 & ...
随机推荐
- vue实现聊天+图片表情功能
项目需求是这样的:要求实现类似于微信聊天一样,表情+文字效果 "文字效果" 表情包三种方案 表情包的实现其实可以分为以下三种情况: 表情包:点击表情--直接发送大表情(这种方案其实 ...
- LOJ 3066 - 「ROI 2016 Day2」快递(线段树合并+set 启发式合并)
LOJ 题面传送门 人傻常数大,需要狠命卡--/wq/wq 画个图可以发现两条路径相交无非以下两种情况(其中红色部分为两路径的重叠部分,粉色.绿色的部分分别表示两条路径): 考虑如何计算它们的贡献,对 ...
- 学军中学csp-noip2020模拟5
Problem List(其实这几场全是附中出的) 这场比赛的题目相当有价值,特别是前两题,相当的巧妙. A.路径二进制 数据范围这么小,当然是搜索. \(30pts:\)大力搜索出奇迹,最后统计答案 ...
- nrf51822 RAM不足分析
之前了解过STM32 的内存分配问题,对于蓝牙芯片51822的内存分配问题把项目中,遇到了.bss和.data部分超了的问题,这其实就是声明的变量和stask 及 heap的大小总和超出了单片机的RA ...
- Docker Swarm的命令
初始化swarm manager并制定网卡地址docker swarm init --advertise-addr 192.168.10.117 强制删除集群docker swarm leave -- ...
- 作为Java技术面试官,我如何深挖候选人的技能
作为Java资深技术面试官,首先我感觉有必要讲解"面试官深挖问题"的动机,在了解动机的前提下,大家才能更好地准备面试.面试官为什么要在一个点上深挖?两大目的. 1 首先是通过深 ...
- 非寻常方式学习ApacheTomcat架构及10.0.12源码编译
概述 开启博客分享已近三个月,感谢所有花时间精力和小编一路学习和成长的伙伴们,有你们的支持,我们继续再接再厉 **本人博客网站 **IT小神 www.itxiaoshen.com 定义 Tomcat官 ...
- C++中Try Catch中的继承
1.C++中Try Catch简介:我们编译运行程序出错的时候,编译器就会抛出异常.抛出异常要比终止程序灵活许多. 而C++异常是指在程序运行时发生的反常行为,这些行为超出了函数正常功能的范围.当程序 ...
- 日常Java 2021/11/17
应用程序转换成Applet 将图形化的Java应用程序(是指,使用AWT的应用程序和使用java程序启动器启动的程序)转换成嵌入在web页面里的applet是很简单的.下面是将应用程序转换成.Appl ...
- 学习java 7.28
学习内容: Applet Applet一般称为小应用程序,Java Applet就是用Java语言编写的这样的一些小应用程序,它们可以通过嵌入到Web页面或者其他特定的容器中来运行,也可以通过Java ...