这道题要注意的是: 当单纯的用组合累乘的话 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 )
基准时间限制: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-12-19 01:36:29