bzoj 3907: 网格 组合数学

3907: 网格

Time Limit: 1 Sec  Memory Limit: 256 MB
Submit: 13  Solved: 7
[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

  这道题可以转化成一次BestCoder的题目我们以y=x这条线将地图补齐,那么就转化成了对于一串括号“(((?????"求合法方案数,那么结合卡特兰数公式h(n)=C(2n,n)-C(2n,n+1)的推导方法可以很容易拓展到本题,详细公式参见代码。

def C(n,m):
    return fact[n]/fact[m]/fact[n-m];
f=raw_input().split(" ");
n=int(f[0]);
m=int(f[1]);
tot=max(n,m)*2;
fact=[1];
for i in range(1,tot+1):
    fact.append(fact[-1]*i);
c=n-m;
ans=C(tot-c,tot/2)-C(tot-c,tot/2+1);
print ans;
时间: 2024-10-15 03:40:22

bzoj 3907: 网格 组合数学的相关文章

BZOJ 3907: 网格【组合数学】

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

BZOJ 3907: 网格

Description 求不跨过直线 \(y=x\) ,到达 \((n,m)\) 的方案数. Sol 组合数学+高精度. 这个推导过程跟 \(Catalan\) 数是一样的. 答案就是 \(C^{n+m}_n-C^{n+m}_{n+1}\) 自己随便化简一下就是 \(\frac {(n+m)!(n-m+1)} {(n+1)!m!}\) . 然后需要先分解下质因数,再用高精度. Code /******************************************************

【BZOJ 3907】 网格

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)

BZOJ 1008 越狱 (组合数学)

题解:正难则反,从总数中减去全部相邻不相同的数目就是答案,n*(n-1)^(m-1):第一个房间有n中染色方案,剩下m-1个房间均只有n-1种染色方案,用总数减就是答案. #include <cstdio> const int mod=100003; typedef long long LL; LL n,m; LL power(LL a,LL b){ LL ans=1; a%=mod; while(b){ if(b&1)ans=ans*a%mod; a=a*a%mod,b>>

bzoj 3997: [TJOI2015]组合数学

3997: [TJOI2015]组合数学 Description 给出一个网格图,其中某些格子有财宝,每次从左上角出发,只能向下或右走.问至少走多少次才能将财宝捡完.此对此问题变形,假设每个格子中有好多财宝,而每一次经过一个格子至多只能捡走一块财宝,至少走多少次才能把财宝全部捡完. Input 第一行为正整数T,代表数据组数. 每组数据第一行为正整数N,M代表网格图有N行M列,接下来N行每行M个非负整数,表示此格子中财宝数量,0代表没有 Output 输出一个整数,表示至少要走多少次. Samp

BZOJ 3997 [TJOI2015]组合数学(单调DP)

[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3997 [题目大意] 给出一个网格图,其中某些格子有财宝,每次从左上角出发,只能向下或右走. 问至少走多少次才能将财宝捡完.此对此问题变形,假设每个格子中有好多财宝, 而每一次经过一个格子至多只能捡走一块财宝,至少走多少次才能把财宝全部捡完. [题解] 最小链覆盖=最长反链,反链的意思就是该集合中的点相互之间不互达, 在该题中,最长反链可以用dp得出. [代码] #include <c

BZOJ 3997 TJOI2015 组合数学 Dilworth定理

题目大意:给定一个网格图,每次从左上角出发,只能往右或往下走,最后到达右下角,每个格子有最低经过次数,问最少走几次 Dilworth定理:DAG的最小链覆盖=最大点独立集 最小链覆盖指选出最少的链(可以重复)使得每个点都在至少一条链中 最大点独立集指最大的集合使集合中任意两点不可达 此题中最大点独立集显然是一个集合满足集合中任意两点都是左下-右上的关系 DP一遍就能出解 复杂度O(Tmn) #include <cstdio> #include <cstring> #include

BZOJ 3028 食物 组合数学

题目大意:简单易懂自己看- - 去学了下母函数相关的东西- - 其实不难理解嘛- - 的说- - #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #define M 510 #define MOD 10007 using namespace std; int n; char s[M]; int main() { int i; scanf("%

BZOJ 2142 礼物 组合数学+数论

题目大意:给定n个物品,分给m个人,每个人拿到wi个礼物,问方案数mod P P不一定为质数 首先我们把剩下的礼物也分给一个人 答案明显不变 w[++m]=n-w1-w2-...-wm 然后就会很方便地得到公式: ans=C(n,w1)*C(n-w1,w2)*C(n-w1-w2,w3)*...*C(n-w1-w2-...-w_(m-1),wm) mod P =n!/w1!/w2!/.../wm! mod P 然后p不是质数 我们把P分解 令P=∏pi^ai 我们分别处理,可以得到一次同余方程组a