【51Nod】1119 - 机器人走方格V2(逆元 & 费马小定理 & 快速幂)

来源:互联网 发布:as3 调用js 编辑:程序博客网 时间:2024/05/22 12:10

点击打开题目

1119 机器人走方格 V2
基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题
 收藏
 关注
M * N的方格,一个机器人从左上走到右下,只能向右或向下走。有多少种不同的走法?由于方法数量可能很大,只需要输出Mod 10^9 + 7的结果。
Input
第1行,2个数M,N,中间用空格隔开。(2 <= m,n <= 1000000)
Output
输出走法的数量 Mod 10^9 + 7。
Input示例
2 3
Output示例
3



这个以前做过类似的,就是求组合数的问题,我们打一个逆元表和一个阶乘表就行了。


代码如下:

#include <stdio.h>#include <cstring>#include <algorithm>using namespace std;#define CLR(a,b) memset(a,b,sizeof(a))#define INF 0x3f3f3f3f#define LL long longconst int mod = 1000000007;int fac[2000005];int inv[2000005];int quick_mod(int a,int b){int ans = 1;while (b){if (b & 1)ans = (LL)ans * a % mod;a = (LL)a * a % mod;b >>= 1;}return ans;}void getFac(){fac[0] = inv[0] = 1;for (int i = 1 ; i <= 2000000 ; i++){fac[i] = ((LL)fac[i-1] * i) % mod;inv[i] = quick_mod(fac[i] , mod-2);}}int C(int a,int b){return (LL)fac[a] * ((LL)inv[b] * inv[a-b] % mod) % mod;}int main(){getFac();int n,m;while (~scanf ("%d %d",&n,&m))printf ("%d\n",C(n+m-2,n-1));return 0;}


0 0
原创粉丝点击