51Nod1119机器人走方格(费马儿定理+快速幂函数) 好题

来源:互联网 发布:单片机第二章答案详解 编辑:程序博客网 时间:2024/06/02 11:41

题目:

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>

1 0
原创粉丝点击