[xdoj1158]阶乘求逆元(常用于求组合数)
2024-08-28 11:17:48
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 ;
}
最新文章
- iOS上线...踩坑
- MYSQL EXPLAIN 很慢的原因
- MySQL 外键异常分析
- Windows Registry
- dubbo源码之三-模块依赖
- sql里将重复行数据合并为一行,数据用逗号分隔
- Android 第三方应用接入微信平台(2)
- Android学习----Activity
- JavaScript ,Python,java,C#,Go系列算法之【插入排序篇】
- VB6之阴影图层
- 架构师之路->;架构师思维的培养
- Linux安装Sqlite
- Springboot中关于跨域问题的一种解决方法
- chrome 无头浏览器的使用
- WebAPI参数传值string转bool,int转bool相关问题
- Codeforces 1039D You Are Given a Tree [根号分治,整体二分,贪心]
- 『TensorFlow』SSD源码学习_其四:数据介绍及TFR文件生成
- 码代码的小女孩(来自noip贴吧)
- noip第17课作业
- Codeforces 405E Graph Cutting