3907: 网格
Time Limit: 1 Sec Memory Limit: 256 MB
Submit: 159 Solved: 74
Description
某城市的街道呈网格状,左下角坐标为A(0, 0),右上角坐标为B(n, m),其中n >= m。现在从A(0, 0)点出发,只能沿着街道向正右方或者正上方行走,且不能经过图示中直线左上方的点,即任何途径的点(x, y)都要满足x >= y,请问在这些前提下,到达B(n, m)有多少种走法。
Input
输入文件中仅有一行,包含两个整数n和m,表示城市街区的规模。
Output
输出文件中仅有一个整数和一个换行/回车符,表示不同的方案总数。
Sample Input
6 6
Sample Output
132
HINT
100%的数据中,1 <= m <= n <= 5 000
排列组合(卡特兰数)+python高精度
从(0,0)到(n,m)的总方案数为C(n+m,m)。
先考虑不经过对角线的方案数:
1.一开始就从(0,0)走到(0,1),那么必然经过对角线 C(n+m-1,m-1)
2.一开始走到(1,0),但是后来经过对角线了,那么把路线翻转一下就和上面的情况一样了,也是C(n+m-1,m-1)
因此ans=C(n+m,m)-2*C(n+m-1,m-1)=C(n+m-1,m)-C(n+m-1,m-1)
而题目要求的是可以经过对角线但不能穿过,只要把(n,m)移到(n+1,m)就和上面的情况等价,此时ans=C(n+m,m)-C(n+m,m-1)
def Fac(n): ans=1 for i in range(2,n+1): ans=ans*i return ans def C(n,m): if (n<m): return 0 return Fac(n)//(Fac(m)*Fac(n-m)) n,m=raw_input().split() n=int(n) m=int(m) print C(n+m,m)-C(n+m,m-1)
时间: 2024-11-02 14:00:56