【题目链接】

点击打开链接

【算法】

用f[i][j]表示走到(i,j)这个位置有多少种方案,因为走到(i,j)这个位置,上一步一定在它左上角的矩形中,所以,

f(i,j) = sigma( f(x,y) ) ( (x,y)在左上角的矩形中)

我们尝试将它画出来,发现是斜着的杨辉三角

然后,通过找规律,我们发现 : f(n,m) = C(n+m-4,n-2)

求C函数的值,这里有一种方法 :

C(n,r) mod P = (n! / (n - r)! / r!) mod P

= (n!) mod P * inv( (n - r)! ) mod P * inv( r! ) mod P( 其中,inv表示乘法逆元 )

考虑预处理阶乘和阶乘逆元

阶乘很容易求,那么,阶乘逆元怎么求呢?

这里有一种线性求阶乘逆元的方法 ( 如果我们要求 inv( n! ) ) :

inv(n ! ) = inv( (n - 1)! n )

= inv( (n - 1)! ) inv( n )

所以 inv( (n - 1)! ) = inv( n ! ) * inv( inv( n ) )

= inv( n! ) * n

有了这个式子,我们便可以在线性时间内求出所有的阶乘逆元

这一题,我们只要预处理阶乘和阶乘逆元,然后,O(1)回答询问,即可

【代码】

#include<bits/stdc++.h>
using namespace std;
#define MAXN 200010
const long long P = ; long long n,m;
long long fac[MAXN],inv[MAXN]; inline long long power(long long a,long long n)
{
long long ans = ,b = a;
while (n > )
{
if (n & ) ans = (ans * b) % P;
b = (b * b) % P;
n >>= ;
}
return ans;
}
inline void init()
{
int i;
fac[] = ;
for (i = ; i < MAXN; i++) fac[i] = fac[i-] * i % P;
inv[MAXN-] = power(fac[MAXN-],P-);
for (i = MAXN - ; i >= ; i--) inv[i] = inv[i+] * (i + ) % P;
}
inline long long C(long long n,long long m)
{
if (!m) return ;
else if (n == m) return ;
else return fac[n] * inv[n-m] % P * inv[m] % P;
} int main() { init();
while (scanf("%d%d",&n,&m) != EOF)
{
printf("%lld\n",C(n+m-,n-));
} return ; } /*
f( n! ) = f( (n-1)! n) = f( (n - 1)! ) f(n)
f( n! ) * f( f(n) ) = f( (n - 1)! )
f( n! ) * n = f( (n - 1)! )
f( n! ) = f ( (n + 1)! ) * (n + 1)
*/

最新文章

  1. 24.Redis2.8主从集群sentinel
  2. C++设计模式-Proxy代理模式
  3. 使用 CUDA 进行计算优化的两种思路
  4. Delphi第一个入门程序——鼠标点击计数 - imsoft.cnblogs
  5. js中的if判断十分优美的简洁写法
  6. 网口扫盲三:以太网芯片MAC和PHY的关系
  7. linux复制多个文件到文件夹
  8. linux kernel API and google android compile guide
  9. yum仓库,RPM打包
  10. 编译GDAL支持ArcObjects
  11. Linux(CentOS 7)安装测试svn服务
  12. 树莓派3B+ HDMI连接显示屏 因供电问题而不能进入系统
  13. CentOS 7 配置DHCP
  14. pychrom 快捷键
  15. ansible执行shell模块和command模块报错| FAILED | rc=127 &gt;&gt; /bin/sh: lsof: command not found和| rc=2 &gt;&gt; [Errno 2] No such file or directory
  16. 中文datepicker控件
  17. node.js fs,http
  18. Ms.office2010安装教程
  19. 【AtCoder】ARC092
  20. android开发学习---基础知识学习、如何导入已有项目和开发一个电话拨号器

热门文章

  1. mysql解决 ERROR 1045 (28000): Access denied for user &#39;root&#39;@&#39;localhost&#39; (using password: YES)的报错
  2. ruby rspec安装
  3. [学习资料] Tiny210(S5PV210) u-boot移植
  4. 基于flask的网页聊天室(一)
  5. npm 发包
  6. noip模拟赛 终末
  7. linux ftp服务器搭建
  8. 动态链接 - dll和so文件区别与构成
  9. Redundant Paths-POJ3177(强连通缩点)
  10. JSP处理日期