51_1118 机器人走方格(组合+乘法逆元)

  这道题要注意的是: 当单纯的用组合累乘的话 1000!即使long long也会溢出 , 所以只能乘一下, mod一下, 但是这样分子分母算出来后, 分子/分母 肯定就已经不是答案(因为 分子%mod / 分母%mod != ans%mod ), 此时, 就要用到乘法逆元。

  ax ≡ 1(mod m) , 则 t1 * x * t2 mod m = t1 -> t1 / t2 = t1* x mod m (将除法转换成乘法, 保证 t1/t2 的结果为 ans%mod )

  1118 机器人走方格

基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题

收藏

关注

M * N的方格,一个机器人从左上走到右下,只能向右或向下走。有多少种不同的走法?由于方法数量可能很大,只需要输出Mod 10^9 + 7的结果。

Input

第1行,2个数M,N,中间用空格隔开。(2 <= m,n <= 1000)

Output

输出走法的数量。

Input示例

2 3

Output示例

3
 1     #include<iostream>
 2     #include<cstdio>
 3     using namespace std;
 4     typedef long long LL;
 5
 6     const LL mod = 1e9 + 7;
 7
 8     void ex_gcd(LL a, LL b, LL &d, LL &x, LL &y){
 9         if(b==0){
10             x =1; y=0 ; d = a;
11             return ;
12         }
13         ex_gcd(b, a%b, d, y, x);
14         y -= x*(a/b);
15     }
16
17     //乘法逆元 ax = 1(mod m)
18     LL inverse(LL a, LL m){
19         LL x, y, d;
20         ex_gcd( a, m, d, x, y);
21         if(d!=1)    return 0;
22         return (x%m + m)%m;
23     }
24
25
26     LL comb(LL m, LL n){
27         LL t1 =1, t2=1;
28         for(LL i = n-m+1 ; i<=n ; ++i)    t1 = t1*i%mod;
29         for(LL i = 1 ; i<=m ; ++i)    t2 = t2*i%mod;
30         return t1*inverse(t2, mod)%mod;
31     }
32
33     int main(){
34         int a, b;
35         cin>> a >> b;
36         cout<<comb(max(a-1, b-1), a+b-2)%mod<<endl;
37     } 
时间: 2024-08-09 10:44:20

51_1118 机器人走方格(组合+乘法逆元)的相关文章

51nod 1119 机器人走方格 V2 (组合数学+逆元)

1119 机器人走方格 V2 基准时间限制: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 分析:因为只能向

1119 机器人走方格 V2(组合)

1119 机器人走方格 V2 基准时间限制: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 //挺懵逼的,虽然看出动规后是个杨辉三

1122 机器人走方格 V4

1122 机器人走方格 V4 基准时间限制:1 秒 空间限制:131072 KB 四个机器人a b c d,在2 * 2的方格里,一开始四个机器人分别站在4个格子上,每一步机器人可以往临近的一个格子移动或留在原地(同一个格子可以有多个机器人停留),经过n步后有多少种不同的走法,使得每个毯子上都有1机器人停留.由于方法数量巨大,输出 Mod 10^9 + 7的结果. Input 输入1个数N(0 <= N <= 10^9) Output 输出走法的数量 Mod 10^9 + 7 Input示例

1120 机器人走方格 V3

1120 机器人走方格 V3 基准时间限制:1 秒 空间限制:131072 KB N * N的方格,从左上到右下画一条线.一个机器人从左上走到右下,只能向右或向下走.并要求只能在这条线的上面或下面走,不能穿越这条线,有多少种不同的走法?由于方法数量可能很大,只需要输出Mod 10007的结果. Input 输入一个数N(2 <= N <= 10^9). Output 输出走法的数量 Mod 10007. Input示例 4 Output示例 10 思路:这个在对角线的上方,就可以转换为,火车进

51nod 1118 机器人走方格 (小数据用dp)

1118 机器人走方格 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 收藏 关注 取消关注 M * N的方格,一个机器人从左上走到右下,只能向右或向下走.有多少种不同的走法?由于方法数量可能很大,只需要输出Mod 10^9 + 7的结果. Input 第1行,2个数M,N,中间用空格隔开.(2 <= m,n <= 1000) Output 输出走法的数量. Input示例 2 3 Output示例 3 设dp[i][j]表示走到第i行第j列有多少种走法.状态转移

1119 机器人走方格 V2

1119 机器人走方格 V2 基准时间限制:1 秒 空间限制:131072 KB 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思路:打个表找个规律,然后发现是组合数,然后取模费马小定理. 1 #in

机器人走方格 V3

1120 . 机器人走方格 V3 基准时间限制:1 秒 空间限制:65536 KB 分值: 160 N * N的方格,从左上到右下画一条线.一个机器人从左上走到右下,只能向右或向下走.并要求只能在这条线的上面或下面走,不能穿越这条线,有多少种不同的走法?由于方法数量可能很大,只需要输出Mod 10007的结果. Input输入一个数N(2 <= N <= 10^9). Output输出走法的数量 Mod 10007. Input 示例4 Output 示例10思路:实际是本质就是,n个0,n个

51Nod1120 机器人走方格 V3

题目 N * N的方格,从左上到右下画一条线.一个机器人从左上走到右下,只能向右或向下走.并要求只能在这条线的上面或下面走,不能穿越这条线,有多少种不同的走法?由于方法数量可能很大,只需要输出Mod 10007的结果. N<=1e9 思路 卡特兰数+卢卡斯定理+乘法逆元算组合数 卡特兰数:某百科卡特兰数词条讲过这种情况. 卢卡斯定理:组合数,模数很小,逐次拆分 乘法逆元,见前面,此处n+1不能保证和p互质,建议用卡特兰数两组合数相减的公式.(不过数据很弱我写的/(n+1)) 代码 #includ

51Nod 1118 机器人走方格--求逆元

(x/y) %mod =x*(y^(mod-2))%mod; 在算x,y的时候可以一直mod 来缩小 y^(mod-2)显然是个快速幂 #include <iostream> #include <stdio.h> #include <math.h> using namespace std; long long mod=1e+9+7; long long quick(long long n,long long m) { long long ans=1; while(m)