https://www.51nod.com/onlineJudge/submitDetail.html#!judgeId=583117
基准时间限制: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
数据比原来的数据大多了,不能再用循环会超时,这时候结论其实是杨辉三角的结论 C(m+n-2,m-1)
现在求得是 (m+n-2)!/(m-1)!%mod 因为取模不能用除法,可以用逆元。另 n=m+n-2,m=m-1; 答案就为n*m'%mod
扩展欧几里德: https://blog.csdn.net/stray_lambs/article/details/52133141
#include<iostream>
#include<string.h>
#include<algorithm>
#define maxn 1000
#define ll long long
using namespace std;
const ll mod=1e9+7;
void exgcd(ll a,ll b,ll &x,ll &y)
{
if(!b)
{
x=1,y=0;
return ;
}
exgcd(b,a%b,y,x);
y-=a/b*x;
}
int main()
{
ll n,m;
cin>>n>>m;
if(n<m)
{
swap(n,m);
}
// m-=1;
n=n+m-2;
m-=1;
ll a=1,b=1,x,y;
// cout<<m<<" "<<n<<endl;
for(ll i=n,j=0;j<m;j++,i--)
{
a=a*i%mod;
}
for(ll i=2;i<=m;i++)
b=b*i%mod;
//cout<<a<<" "<<b<<endl;
exgcd(b,mod,x,y);
x=(x%mod+mod)%mod;
cout<< a*x%mod <<endl;
return 0;
}
小费马定理:a^(p-1)=1mod(p)
我们要求:a/b%mod=x; a/b=x%mod;
a*b^(mod-2)=x%mod a*b^(mod-2)%mod=x;
#include<iostream>
#define ll long long
using namespace std;
const ll mod=1e9+7;
int quick_pow(ll a,ll b)
{
ll ans=1;
while(b)
{
if(b%2)
ans=ans*a%mod;
a=a*a%mod;
b/=2;
}
return (ans+mod)%mod;
}
int main(void){
ll a=1,b=1,n,m;
cin>>m>>n;
if(n<m)
swap(n,m);
n=n+m-2;
m-=1;
for(ll i=n,j=0;j<m;j++,i--)
{
a=a*i%mod;
}
for(ll i=m;i>=2;i--)
{
b=b*i%mod;
}
//cout<<a<<" "<<b<<endl;
cout<<a*quick_pow(b,mod-2)%mod<<endl;
return 0;
}