[xdoj1158]阶乘求逆元(常用于求组合数)
http://acm.xidian.edu.cn/problem.php?id=1158
解题关键:此题注意将$\sum\limits_{i = 0}^x {C_x^iC_y^{i + k}}$转化为$C_{x + y}^{x + k}$
利用二项式定理,
一方面,
${(1 + a)^y}{(1 + \frac{1}{a})^x}$的${a^k}$项的系数,第一个二项式的${a^j}$的系数$C_y^j$,第二个二项式的${a^{ - i}}$系数为$C_x^i$,令$j - i = k$,$j = i + k$,即$\sum\limits_{i = 0}^x {C_x^iC_y^{i + k}}$
另一方面,
${(1 + a)^y}{(1 + \frac{1}{a})^x} = {(1 + a)^{x + y}}{a^{ - x}}$,此时${a^k}$项的系数为$C_{x + y}^{x + k}$,得证。
1、打表
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod=1e9+;
ll x,y,k;
ll fac[],inv[]; ll mod_pow(ll x,ll n,ll mod){
ll res=;
while(n){
if(n&) res=res*x%mod;
n>>=;
x=x*x%mod;
}
return res;
} ll Inv(ll x){
return mod_pow(x,mod-,mod);
} int main(){
fac[]=;
for(int i=;i<=;i++) fac[i]=fac[i-]*i%mod;//预处理一下,阶乘
inv[]=mod_pow(fac[],mod-,mod);//Fac[N]^{MOD-2}
for(int i=-;i>=;i--) inv[i]=inv[i+]*(i+)%mod; while(~scanf("%lld%lld%lld",&x,&y,&k)){
if(y==k) printf("1\n");
else if(y<k) printf("0\n");
// else printf("%lld\n",fac[x+y]*inv(fac[x+k])%mod*inv(fac[y-k])%mod);
else printf("%lld\n",(fac[x+y]%mod*inv[x+k]%mod*inv[y-k]%mod+mod)%mod);
}
return ;
}
2、打表+逆元实现
为什么是$n{!^{\bmod - 2}}$
$n{!^{p - 2}}*n! = n{!^{p - 1}} = 1\bmod {\rm{ p;}}$(费马小定理)p为质数,此题中即为mod
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod=1e9+;
ll x,y,k;
ll fac[],inv[]; ll mod_pow(ll x,ll n,ll mod){
ll res=;
while(n){
if(n&) res=res*x%mod;
n>>=;
x=x*x%mod;
}
return res;
} ll Inv(ll x){
return mod_pow(x,mod-,mod);
} int main(){
fac[]=;
for(int i=;i<=;i++) fac[i]=fac[i-]*i%mod;//预处理一下,阶乘
//inv[2000000]=mod_pow(fac[2000000],mod-2,mod);//Fac[N]^{MOD-2}
//for(int i=2000000-1;i>=0;i--) inv[i]=inv[i+1]*(i+1)%mod; while(~scanf("%lld%lld%lld",&x,&y,&k)){
if(y==k) printf("1\n");
else if(y<k) printf("0\n");
else printf("%lld\n",fac[x+y]*Inv(fac[x+k])%mod*Inv(fac[y-k])%mod);
//else printf("%lld\n",(fac[x+y]%mod*inv[x+k]%mod*inv[y-k]%mod+mod)%mod);
}
return ;
}
[xdoj1158]阶乘求逆元(常用于求组合数)的更多相关文章
- HNU 12933 Random Walks Catalan数 阶乘求逆元新技能
一个Catalan数的题,打表对每个数都求一次逆元会T,于是问到了一种求阶乘逆元的打表新方法. 比如打一个1~n的阶乘的逆元的表,假如叫inv[n],可以先用费马小定理什么的求出inv[n],再用递推 ...
- 扩展gcd求逆元
当模数为素数时可以用费马小定理求逆元. 模数为合数时,费马小定理大部分情况下失效,此时,只有与模数互质的数才有逆元(满足费马小定理的合数叫伪素数,讨论这个问题就需要新开一个博客了). (对于一个数n, ...
- 求组合数、求逆元、求阶乘 O(n)
在O(n)的时间内求组合数.求逆元.求阶乘.·.· #include <iostream> #include <cstdio> #define ll long long ;// ...
- HDU 5698——瞬间移动——————【逆元求组合数】
瞬间移动 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submis ...
- Codeforces Round #361 (Div. 2) E. Mike and Geometry Problem 【逆元求组合数 && 离散化】
任意门:http://codeforces.com/contest/689/problem/E E. Mike and Geometry Problem time limit per test 3 s ...
- 牛客小白月赛14 -B (逆元求组合数)
题目链接:https://ac.nowcoder.com/acm/contest/879/B 题意:题目意思就是求ΣC(n,i)pi(MOD+1-p)n-i (k<=i<=n),这里n,i ...
- 数学--数论--HDU 4675 GCD of Sequence(莫比乌斯反演+卢卡斯定理求组合数+乘法逆元+快速幂取模)
先放知识点: 莫比乌斯反演 卢卡斯定理求组合数 乘法逆元 快速幂取模 GCD of Sequence Alice is playing a game with Bob. Alice shows N i ...
- CodeForces 146E - Lucky Subsequence DP+扩展欧几里德求逆元
题意: 一个数只含有4,7就是lucky数...现在有一串长度为n的数...问这列数有多少个长度为k子串..这些子串不含两个相同的lucky数... 子串的定义..是从这列数中选出的数..只要序号不同 ...
- HDU 5446——Unknown Treasure——————【CRT+lucas+exgcd+快速乘+递推求逆元】
Each test case starts with three integers n,m,k(1≤m≤n≤1018,1≤k≤10) on a line where k is the number o ...
随机推荐
- 自定义xhr请求
接上一篇博客,上一篇是之前的jsonp请求方法的封装,这一篇是xhr请求的简单封装. 原理: 1:new一个xhr对象,命名为ajaxRequest,由于浏览器兼容性的问题,所以将获取xhr对象的方式 ...
- var妙用
var广泛使用其实也有用的.比如在一些不太确定类型的地方 (比如要区分int/uint/long/double的时候),用泛型太牛刀而不用又觉得不灵活的时候,其实是比较推荐var的比如设计某种类的时候 ...
- linux操作系统使用中的一些总结
VIM常用命令 gg //到第一行 (N)G //到第n行(N为整数) G //到最后一行 0 //到行头 $ //到行尾 (N)dd //删除N行,并将内容保存到粘贴板 p ...
- String类型的对象,是保存在堆里还是在栈里呢?
在Java的实现中,new出来的String对象一般是放在堆中的. 如果是 String s ="xxx"; 这种,那就是放在常量池中. JDK6将常量池放在方法区中. 方法区此时 ...
- (vue.js)vue中引用了别的组件 ,如何使this指向Vue对象
Vue中引用了别的组件 ,如何使this指向Vue对象 今天学习Vue组件传值, 通过创建Vue实例, 广播和监听实现传值, 但是传值之后无法直接将得到的值应用到Vue对象, 因为这相当于引用改了别的 ...
- win7 apache+openssl 安装
win7 apache+openssl 安装 博客分类: win7 apache+openssl 安装 win7 apache+openssl 安装 注:附件提供包含apache和openssl的安 ...
- EntityFramework 学习 一 Querying with EDM 从EDM查询
前面我们已经创建EDM.DbContext和实体类,接下来我们学习不同的查询实体方法,转变为数据库的SQL查询 Entity Framework支持3种查询方式:1)LINQ to Entities ...
- hdu 4542 小明系列故事——未知剩余系 反素数 + 打表
小明系列故事——未知剩余系 Time Limit: 500/200 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others) Prob ...
- jquery详解图片平滑滚动
jquery详解图片平滑滚动 随便写了个DOM,没有美观性,见谅 原理: 1.定义两组ul列表放图,第一个ul放5张图,第二个ul为空 2.为什么要用两个ul?因为要用到jQuery的克隆方法clon ...
- AMD模块定义规范
AMD 即Asynchronous Module Definition,中文名是“异步模块定义”的意思.它是一个在浏览器端模块化开发的规范,服务器端的规范是CommonJS. 模块将被异步加载,模 ...