您的位置:首页 > 其它

51nod 1119 机器人走方格 (简单数论)

2016-09-06 17:50 232 查看
<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">原题链接为 http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1119</span> 参考:http://blog.csdn.net/hahaall/article/details/50581935

此题可用求逆元的方法求解,其中还要用到费马小定理

若要求 a/b=X(mod P)

则可以转化为a*b'=X(mod P)  其中b'为b关于mod P的逆元;

而求逆元则可以用费马小定理:

如果P为质数,并且b不为P的倍数,则b^(p-1)=1(mod P)成立

于是:a / b = a / b * (b * b ^ (P-2)) = a * (b ^ (P-2)) (mod P).

代码如下:

#include<bits/stdc++.h>
using namespace std;
const long long mod=1e9+7;
int main()
{
int m,n;
cin>>m>>n;
long long a=1,b=1,k=m+n-2,t=min(m,n)-1;
while(t)
{
a=(a*k)%mod;
k--;t--;
}
t=min(m,n)-1;
while(t)
{
b=(b*t)%mod;
t--;
}
long long sum=1,p=mod-2,q=b;
while(p)
{
if(p%2)
sum=(sum*q)%mod;
p/=2;
q=(q*q)%mod;
}
sum=(sum*a)%mod;
cout<<(sum+mod)%mod<<endl;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: