码迷,mamicode.com
首页 > 其他好文 > 详细

【BZOJ 3907】 网格

时间:2015-04-02 09:15:03      阅读:135      评论:0      收藏:0      [点我收藏+]

标签:bzoj   oi   数论   python   

3907: 网格

Time Limit: 1 Sec  Memory Limit: 256 MB
Submit: 159  Solved: 74
[Submit][Status][Discuss]

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)


技术分享

【BZOJ 3907】 网格

标签:bzoj   oi   数论   python   

原文地址:http://blog.csdn.net/regina8023/article/details/44815311

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!