博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【HDU 5698】瞬间移动(组合数,逆元)
阅读量:5821 次
发布时间:2019-06-18

本文共 792 字,大约阅读时间需要 2 分钟。

x和y分开考虑,在(1,1)到(n,m)之间可以选择走i步。就需要选i步对应的行C(n-2,i)及i步对应的列C(m-2,i)。相乘起来。 假设$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$$
两边乘上$i^{-1}\cdot r^{-1}$(如果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}$$
代码

#include
#define M 1000000007#define N 200001#define ll long longll 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

 

  

转载地址:http://kibdx.baihongyu.com/

你可能感兴趣的文章
理解 QEMU/KVM 和 Ceph(3):存储卷挂接和设备名称
查看>>
一道算法题的一种O(n)解法
查看>>
ABP理论学习之NHibernate集成
查看>>
反射之动态创建对象
查看>>
隐马尔可夫模型学习小记——forward算法+viterbi算法+forward-backward算法(Baum-welch算法)...
查看>>
[MFC] CList
查看>>
[Android Pro] 完美Android Cursor使用例子(Android数据库操作)
查看>>
4 张 GIF 图帮助你理解二叉查找树
查看>>
c++中sizeof的分析
查看>>
线程间操作无效: 从不是创建控件的线程访问它的解决方法
查看>>
hdu 1236 排名
查看>>
【爆牙游记】黄山归来不看岳-日出。
查看>>
PHP面向对象深入研究之【继承】,减少代码重复
查看>>
RBAC权限管理
查看>>
此博客不再发表对自己私事的看法
查看>>
后台(20)——数据库连接池
查看>>
C# 开机自动启动程序
查看>>
导致Asp.Net站点重启的10个原因
查看>>
v7000数据恢复_MDisk重建数据恢复方法(北亚数据恢复)
查看>>
线分割平面与平面分割空间问题
查看>>