51Nod1119机器人走方格(费马儿定理+快速幂函数) 好题
2016-01-31 05:07
260 查看
题目:
M * N的方格,一个机器人从左上走到右下,只能向右或向下走。有多少种不同的走法?由于方法数量可能很大,只需要输出Mod 10^9 + 7的结果。
Input
Output
Input示例
Output示例
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
个人感觉是一道好题。
从大神博客学得。http://blog.csdn.net/h1021456873/article/details/49587483
另一种解法(效率稍微高点,扩展欧几里德) http://blog.csdn.net/h1021456873/article/details/49402147
<span style="font-size:24px;">#include"stdio.h" #include"stdlib.h" #include"string.h" #include"algorithm" #include"math.h" const int maxn= 1000000+5; const int mod=1e9+7; //注意这种写法 long long f[maxn*2+5]; void Init() { f[0]=1; for(int i=1;i<=2*maxn;i++) f[i]=(f[i-1]*i)%mod; } long long pow(long long a,long long n) { if(n==0) return 1; long long x=pow(a,n/2); long long ans=x*x%mod; if(n%2==1) ans=ans*a%mod; return ans; } /*long long pow(long long n,long long m ) //另一种快速幂非递归写法 { long long ans = 1; while(m > 0) { if(m & 1)ans = (ans * n) % mod; m = m >> 1; n = (n * n) % mod; } return ans; }*/ long long solve(int n,int m) { long long ans=f[n-1+m-1]; ans=(ans*pow(f[n-1],mod-2))%mod; ans=(ans*pow(f[m-1],mod-2))%mod; return ans; } int main() { Init(); int n,m; scanf("%d%d",&n,&m); printf("%lld",solve(n,m)); return 0; }</span>
<span style="font-size:24px;">如果有从这里学习到,请鼓励我一下吧,顶一个。</span>
相关文章推荐
- LeetCode_46 Permutations
- EXT心得--并非所有的items配置对象都属于EXT的内置类
- Nose+Jekins进行测试和持续集成
- 8633回文划分
- iOS之UI--辉光动画
- EXT经验--查询EditorGridPanel的tbar的默认配置对象
- Leetcode 48. Rotate Image
- 51Nod(1256乘法逆元逆元)
- 动画交互设计与技术实现
- Leetcode 90. Subsets II
- set常见操作:
- 【jQuery基础学习】04 jQuery中的表格操作及cookie插件的使用
- CC150 Bit manipulation
- INNO 仿有道云安装界面
- Redis
- redis 链表操作
- 深夜脑洞,写了一个可以推算火车票身份证号码的小程序
- composer 详解
- 蜗牛爱课- CGAffineTransformMakeRotation 实现一张图片的自动旋转
- CC150 chapter 1 Arrays and strings.