ABC156D
[题目链接]https://atcoder.jp/contests/abc156/tasks/abc156_d
简单数论问题,题意就是有n个数,不能组成a与b个数,问有多少种组合方式
那就是C(n,1)+C(n,2)+....+C(n,n)-C(n,a)-C(n,b)
和式部分为2^n-1
由于a,b的范围在2e5,直接运用逆元+原始定义求两个组合数就行了
#include<bits/stdc++.h>
using namespace std;
#define lowbit(x) ((x)&(-x))
typedef long long LL;
const LL MOD = 1e9+7;
void ex_gcd(LL a, LL b, LL& x, LL& y) {
if(!b) {
x = 1, y = 0;
} else {
ex_gcd(b, a%b, y, x);
y -= x * (a / b);
}
}
LL inv(LL t, LL p) {
LL x, y, d;
ex_gcd(t, p, x, y);
return (x%p+p)%p;
}
LL quick_pow(LL a, LL b, LL p) {
LL ret = 1;
while(b) {
if(b & 1) ret = (ret * a) % p;
a = (a * a) % p;
b >>= 1;
}
return ret;
}
void run_case() {
LL n, a, b;
cin >> n >> a >> b;
if(n <= 2) {
cout << "0";
return;
}
LL all = quick_pow(2, n, MOD) - 1;
LL fa = 1, fb = 1;
// get a! and b!
for(LL i = a; i >= 1; --i)
fa = (fa * i) % MOD;
for(LL i = b; i >= 1; --i)
fb = (fb * i) % MOD;
LL n1 = 1, n2 = 1;
// get n*(n-1)---*(n-a+1)
for(LL i = n; i >= n-a+1; --i)
n1 = (n1 * i) % MOD;
for(LL i = n; i >= n-b+1; --i)
n2 = (n2 * i) % MOD;
//get MOD inverse
LL invfa = inv(fa, MOD), invfb = inv(fb, MOD);
all = ((all - n1*invfa%MOD)+MOD)%MOD;
all = ((all - n2*invfb%MOD)+MOD)%MOD;
cout << all;
}
int main() {
ios::sync_with_stdio(false), cin.tie(0);
cout.flags(ios::fixed);cout.precision(10);
run_case();
cout.flush();
return 0;
}
ABC156D的更多相关文章
- AT5341 [ABC156D] Bouquet 题解
Content 有一个人有 \(n\) 种不同的话可供选择,TA 可以选择至少一种花做花束,但是 TA 不喜欢花的种数为 \(a\) 或者 \(b\) 的花束.求选花的方案数对 \(10^9+7\) ...
随机推荐
- 【译】通过 Rust 学习解析器组合器 — Part 1
原文地址:Learning Parser Combinators With Rust 原文作者:Bodil 译文出自:掘金翻译计划 本文永久链接:https://github.com/xitu/gol ...
- 1032 Sharing (25分)
1032 Sharing (25分) 题目 思路 定义map存储所有的<地址1,地址2> 第一set存放单词1的所有地址(通过查找map) 通过单词二的首地址,结合map,然后在set中查 ...
- CI框架Email类发送邮件提示Unable to send data: . The following SMTP error was encountered: Unable to .......
最近服务器迁移,然后CI框架做的项目发邮件全挂掉了,刚开始是25端口没开,然后开了正好还是有问题, 1.打印请求信息和返回信息 echo $this->email->print_debug ...
- CentOS 7 如何设置为eth0网卡
参考文章https://www.linuxidc.com/Linux/2017-06/144973.htm 主要方法 1) 安装的时候,在内核选项中加上net.ifnames=0 biosdevnam ...
- 每天进步一点点------Allegro 布线时显示延迟以及相对延迟信息
PROPAGATION_DELAYPROPAGATION_DELAY这个设定主要用来对Net绝对长度的设定,如要求设定一组Net的长度要在Min Mil到 Max Mil之间的话,就可以用这种设定来完 ...
- 网络、芯片、专利、产业链……影响5G手机走势的因素有哪些?
近段时间,备受关注的5G手机迎来一个爆发的小高潮.中国质量认证中心官网显示8款5G手机获得3C认证.其中华为有4款 ,一加.中兴.OPPO和vivo各有一款5G手机获得3C认证.随后在7月23日,中兴 ...
- Collection两个常见的集合类型: ArrayList可重复集有序 ,HashSet不可重复集
package seday11; import java.util.ArrayList; import java.util.Collection; import java.util.HashSet; ...
- 有源汇有上下界最小流 (ZQU 1592)
这道题跟求最大流的时候差不多. 都是先构造可行流,然后判断是否可行, 可行的话,就利用残余流量,构造从汇点t跑到源点s的最大流, 如何求出答案呢. 在第一次求可行流的dinic后,跟求最大流的时候一样 ...
- 结构体sizeof()问题与字节对齐
32位机器上定义如下结构体: struct xx { long long _x1; char _x2; int _x3; char _x4[2]; static int _x5; }; int xx: ...
- 【C语言】创建一个函数,利用该函数将两个字符串连接起来
代码: #include<stdio.h> ], ]) { int i, j; ; c[i] != '\0'; i++); ; d[j] != '\0'; j++) { c[i++] = ...