51nod 1118 机器人走方格 (排列组合+乘法逆元!!!)

原创 2015年10月25日 11:12:32


M * N的方格,一个机器人从左上走到右下,只能向右或向下走。有多少种不同的走法?由于方法数量可能很大,只需要输出Mod 10^9 + 7的结果。
Input
第1行,2个数M,N,中间用空格隔开。(2 <= m,n <= 1000)
Output
输出走法的数量。
Input示例
2 3
Output示例
3

以前一直在用逆元,没想到今天用模板卡了,还是对概念了解的不够。今天在kuangbin神的指导下,稍稍懂了一点。

逆元:

定义 对a∈Zm,存在b∈Zm,使得a+b ≡ 0 (mod m),则b是a的加法逆元,记b= - a。
定义 对a∈Zm,存在b∈Zm,使得a×b ≡1 (mod m),则称b为a的乘法逆元
我们通常所指的是乘法逆元。

然而乘法逆元的应用也需要条件:

对于乘法逆元:在mod m的操作下(即Zm中),a存在乘法逆元当且仅当a与m互质不定方程ab+mx=1的任意一组整数解(b,x),b就是a的乘法逆元。具体计算可以使用扩展欧几里德算法(Extended-GCD)。

kuangbin神给的模板



//返回d=gcd(a,b);和对应于等式ax+by=d中的x,y
long long extend_gcd(long long a,long long b,long long &x,long long &y)
{
    if(a==0&&b==0) return -1;//无最大公约数
    if(b==0){x=1;y=0;return a;}
    long long d=extend_gcd(b,a%b,y,x);
    y-=a/b*x;
    return d;
}
//*********求逆元素*******************
//ax = 1(mod n)
long long mod_reverse(long long a,long long n)
{
    long long x,y;
    long long d=extend_gcd(a,n,x,y);
    if(d==1) return (x%n+n)%n;
    else return -1;
}


#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
const int mod=1e9+7;
typedef long long ll;
//返回d=gcd(a,b);和对应于等式ax+by=d中的x,y
ll extend_gcd(ll a,ll b,ll &x,ll &y)
{
    if(a==0&&b==0) return -1;//无最大公约数
    if(b==0){x=1;y=0;return a;}
    ll d=extend_gcd(b,a%b,y,x);
    y-=a/b*x;
    return d;
}
//*********求逆元素*******************
//ax = 1(mod n)
ll mod_reverse(ll a,ll n)
{
    ll x,y;
    ll d=extend_gcd(a,n,x,y);
    if(d==1) return (x%n+n)%n;
    else return -1;
}

ll c(ll m,ll n)
{
	ll i,j,t1,t2,ans;
	t1=t2=1;
	for(i=n;i>=n-m+1;i--) t1=t1*i%mod;
	for(i=1;i<=m;i++) t2=t2*i%mod;
	return  t1*mod_reverse(t2,mod)%mod;
}

int main()
{
	ll n,m,ans;
	cin>>m>>n;
	ans=c(min(m-1,n-1),m+n-2);
	cout<<ans<<endl;
	return 0;
} 


取模情况下,逆元后就把它当做乘法。。。取模规则不变就行。。。此处wa了N发




版权声明:本文为博主原创文章,未经博主允许不得转载。

51Nod-1118-机器人走方格

M * N的方格,一个机器人从左上走到右下,只能向右或向下走。有多少种不同的走法?由于方法数量可能很大,只需要输出Mod 10^9 + 7的结果。 Input 第1行,2个数M,N,中间用空格隔开...
  • f_zyj
  • f_zyj
  • 2016年04月28日 14:47
  • 821

Java实现排列组合算法

用Java实现排列算法: package Sort; import java.util.ArrayList; import java.util.List; public class Arrange...
  • YHYR_YCY
  • YHYR_YCY
  • 2016年09月13日 09:51
  • 12358

51nod 1118 机器人走方格(简单DP)

基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 M * N的方格,一个机器人从左上走到右下,只能向右或向下走。有多少种不同的走法?由于方法数量可能很...
  • wuxiushu
  • wuxiushu
  • 2016年05月17日 16:42
  • 736

求逆元-51nod1118机器人走方格

思路: 高中数学题,向下三步,向右两步 C (2 , 3 +2 ) 总共五步,选择哪两步往右走。 通过学长的讲解明白了如何把这个阶乘级别的式子缩小: y/x %mod =x*(y^(mod-2))%m...
  • qq_33951440
  • qq_33951440
  • 2016年09月15日 19:48
  • 234

UVA - 557 Burger 排列组合 概率

你题目大意:有N个孩子去吃汉堡,他们点了N个汉堡,N个汉堡中,其中N/2个是鸡腿堡,另外N/2个是牛肉堡。这N个孩子坐成了一个圈,然后抛硬币决定哪个孩子该得到哪种汉堡,每个孩子只能得一个汉堡,顺时针轮...
  • L123012013048
  • L123012013048
  • 2015年01月13日 14:37
  • 784

UVA 1600 巡逻机器人

巡逻机器人 Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu 题意·:一个机器人从(1,...
  • the_love_story
  • the_love_story
  • 2016年10月27日 16:54
  • 193

51nod_1118 机器人走方格(组合数+逆元)

1118 机器人走方格 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度M * N的方格,一个机器人从左上走到右下,只能向右或向下走。有多少种不同的走法?由于方法数量可能很大,只...
  • lwlldd
  • lwlldd
  • 2017年04月26日 15:09
  • 257

51nod-【1118 机器人走方格】

1118 机器人走方格 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题  收藏  关注 M * N的方格,一个机器人从...
  • Cai_Nia
  • Cai_Nia
  • 2016年10月25日 13:32
  • 227

对排列组合的理解

全排列的意思大家也许都很明白,但是,如果用编程来实现的话,那你会不会觉得很难呢?也许会。我以前在看到全排列的题目时,我觉得非常的害怕,因为这么多的数或元素怎么实现全排列啊,真觉得不可思议。以前就是会想...
  • wingahi
  • wingahi
  • 2014年01月25日 15:30
  • 1383

深入探讨:如何实现排列组合

一、引言当你点开了这篇博客,希望你能站在跟我一起探讨的角度上来思考这个问题,那么也许你能获得更多的启示 ^_^。最近在做 LeetCode 的时候,有一道题让我想到了另一个问题: 如何编程实现排列...
  • u012814856
  • u012814856
  • 2017年06月28日 20:07
  • 499
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:51nod 1118 机器人走方格 (排列组合+乘法逆元!!!)
举报原因:
原因补充:

(最多只允许输入30个字)