前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【HDU 5698】瞬间移动(组合数,逆元)

【HDU 5698】瞬间移动(组合数,逆元)

作者头像
饶文津
发布2020-06-02 15:43:41
4390
发布2020-06-02 15:43:41
举报
文章被收录于专栏:饶文津的专栏饶文津的专栏

m\leq n

$\sum_{i=1}^{m-2} C_{n-2}^i\cdot C_{m-2}^i=\sum_{i=1}^{m-2} C_{n-2}^i\cdot C_{m-2}^{m-2-i}=C_{n+m-4}^{m-2}

然后标程里求i的阶乘的逆是预处理的,主要这句:

f[i]=(M-M/i)\cdot f[M\%i]\%M

这里f即i的逆元,为什么可以这么求呢?

首先这里的M必须是质数。

M=k\cdot i+r \equiv 0 \pmod M

两边乘上(如果M不是质数,r就可能为0)

\begin{eqnarray} k\cdot r^{-1}+i^{-1} &\equiv& 0 &\pmod M\\i^{-1} &\equiv& -k\cdot r^{-1} &\pmod M\\i^{-1} &\equiv& M-\left\lfloor\frac{M}{i}\right\rfloor\cdot \left(M\bmod i\right)^{-1} &\pmod M \end{eqnarray}
代码语言:javascript
复制
#include<cstdio>
#define M 1000000007
#define N 200001
#define ll long long
ll fac[N]={1,1},inv[N]={1,1},f[N]={1,1};
int n,m;
ll C(ll a,ll b){
    return fac[a]*inv[b]%M*inv[a-b]%M;
}
int main(){
    for(int i=2;i<N;i++){
        fac[i]=fac[i-1]*i%M;
        f[i]=(M-M/i)*f[M%i]%M;
        inv[i]=inv[i-1]*f[i]%M;
    }
    while(~scanf("%d%d",&n,&m))
        printf("%lld\n",C(m+n-4,m-2));
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2016-07-24 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档