您的位置:首页 > 其它

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

2016-01-31 05:07 260 查看
题目:

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>





                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: