51nod 1119 机器人走方格V2 lucas定理
2017-08-21 09:40
330 查看
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
题解:
这题不能像v1那样dp了。如果n,m小的话可以递归求解,但是这里n,m太大,数组开不了。我们取一个小一点的n,m。用递推填表,可以发现表是一个杨辉三角。杨辉三角在第n行第m列的值为C(n-1,m-1)。可以得到[n,m]位置处应该填上C(n-1+m-1,n-1).
代码:
#include <bits/stdc++.h> using namespace std; #define MOD 1000000007 typedef long long LL; LL quickPower(LL a, LL b) { LL ans = 1; a %= MOD; while (b) { if (b & 1) { ans = ans * a % MOD; } b >>= 1; a = a * a % MOD; } return ans; } LL c(LL n, LL m) { if (m > n) { return 0; } LL ans = 1; for (int i = 1; i <= m; i++) { LL a = (n + i - m) % MOD; LL b = i % MOD; ans = ans * (a * quickPower(b, MOD - 2) % MOD) % MOD; } return ans; } LL lucas(LL n, LL m) { if (m == 0) { return 1; } return c(n % MOD, m % MOD) * lucas(n / MOD, m / MOD) % MOD; } int main() { LL n, m; while (~scanf("%lld %lld", &n, &m)) { LL max, min; max = n + m - 2; min = m - 1; printf("%lld\n", lucas(max , min )); } return 0; }
相关文章推荐
- 51nod 1119 机器人走方格 V2 (求组合数__模板)
- 【51Nod】1119 - 机器人走方格V2(逆元 & 费马小定理 & 快速幂)
- 51nod 1118 机器人走方格 & 1119 机器人走方格 V2(排列组合)
- 51nod 1119 机器人走方格V2(求组合数,费马小定理+快速幂/逆元+gcd)
- 51nod 1119:机器人走方格 V2
- 51nod 1119 机器人走方格 V2 费马小定理求组合数
- 51nod 1119 机器人走方格 V2 【组合数学】
- 51Nod - 1119 机器人机器人走方格 v2
- 51 NOD 1119 机器人走方格 V2(Lucas)
- 51nod 1119 机器人走方格 V2
- 51Nod 1119 机器人走方格 V2
- 机器人走方格 V2 51Nod - 1119 组合数学+逆元
- 51Nod-1119-机器人走方格 V2
- 51nod-1119 1119 机器人走方格 V2(组合数学+乘法逆元+快速幂)
- [51NOD1119]机器人走方格 V2(dp,Lucas定理)
- 51nod 1120 机器人走方格 V3 卡特兰数 lucas定理
- 51nod 1118 机器人走方格 解题思路:动态规划 & 1119 机器人走方格 V2 解题思路:根据杨辉三角转化问题为组合数和求逆元问题
- 51nod 1119 机器人走方格 V2【组合数学+逆元】
- 51Nod 1119 机器人走方格 V2
- 51nod 1119 机器人走方格 V2 求大组合取模--逆元