51Nod-1119-机器人走方格 V2

ACM模版

描述

描述

题解

数学组合问题,求C(n - 1 + m - 1, n - 1)即可。

代码

#include<iostream>
#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, t_1, t_2;
    t_1 = t_2 = 1;
    for (i = n; i >= n - m + 1; i--)
    {
        t_1 = t_1 * i % mod;
    }
    for (i = 1; i <= m; i++)
    {
        t_2 = t_2 * i % mod;
    }
    return  t_1 * mod_reverse(t_2, 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;
}

参考

HDU-5698-瞬间移动

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值