【BZOJ3907】网格 组合数,补集转换

链接:

#include <stdio.h>
int main()
{
    puts("转载请注明出处[vmurder]谢谢");
    puts("网址:blog.csdn.net/vmurder/article/details/44944381");
}

题解:

首先从 (0,0) 到 (n,m) 是右走 n 步, 上走 m 步。方案数是在 n 个数中 n+1 个空中插 m 个数,组合数是Cmn+m。

然后从中减去穿过 y=x 这条线的那些方案数就好了。

但是这个很难求,而若要求 [ 不经过 ] 则就可以有特别的技巧了。

假设第一步向上,那么最终无论如何都要经过这条线,因为向上已经走一步,所以需要去掉的方案数则为 Cm?1n+m?1 。

然后如果第一步向右,则若一个方案从起点到最后一次经过 y=x 这条线的那个点的整个路径都沿 y=x 这条直线翻转,剩余到终点 (n,m) 的路径不进行变动,则正好对应唯一一种第一步向上走的方案。而这种情况的方案数则为 Cn?1n+m?1 。

所以求不经过,答案则是 【全集】Cmn+m?【补集】2?Cm?1n+m?1

那么我们怎么转化成不穿过呢?

观察发现第一步向上,则定然不符合要求需要被删掉;而第一步向右,满足要求的所有方案,因为无法经过 y=x 这条直线,所以它们被一条无形的线 y=x?1 禁锢着,只要越过这条线就会碰触到 y=x 。所以 [ 不经过 ] 情况下的询问 (n,m) 正好对应着 [ 不穿过 ] 情况下的询问 (n?1,m)

所以最终答案是 【全集】Cmn+m+1?【补集】2?Cm?1n+m

特殊的骗分技巧:

n==m时答案是卡特兰数哦骚年~

这个可以打表发现!

代码:

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+1,m)-2*C(n+m,m-1)
时间: 2024-08-04 12:07:44

【BZOJ3907】网格 组合数,补集转换的相关文章

【前端】Vue.js实现网格列表布局转换

网格列表布局转换 实现效果: 实现代码及注释: <!DOCTYPE html> <html> <head> <title>布局转换</title> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-e

hihocoder 1191 小W与网格 (组合数)

时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 给定一个n*m的网格,左上角(1, 1),右下角(n, m). 小w在(i, j),他会从"上左下右"四个方向中选定两个不同但正交的方向,然后他只能沿着这两个方向走,直到他走出网格. 小w想知道有多少种不同的走法. 两个走法不同当且仅当所经过的格子的集合不同. 输入 输入包含多组数据. 每组数据一行四个整数n, m, i, j.(1 <= i <= n <= 100, 1 <= j &l

排列组合问题的一些整理

初步:加法原理和乘法原理 概念: 加法原理是分类计数原理,常用于排列组合中,具体是指:做一件事情,完成它有n类方式,第一类方式有M1种方法,第二类方式有M2种方法,--,第n类方式有Mn种方法,那么完成这件事情共有M1+M2+--+Mn种方法. 做一件事,完成它需要分成n个步骤,做第一 步有m1种不同的方法,做第二步有m2种不同的方法,--,做第n步有mn种不同的方法.那么完成这件事共有 N=m1×m2×m3×-×mn 种不同的方法. 这个感觉大家都知道(小学奥数就开始学了吧qwq),感觉没有什

卡特兰数相关

这一块一直学的不太好,基本停留在看到题可以看出来是个卡特兰数,但进一步的思考和推导,对我来说就变得困难起来,所以今天趁有时间,复习一下 前言 卡特兰数多用在组合数学的计数问题中,多是那种有两种选择,也就是求有限制的方案数 公式 $h(n)=h(0){\times}h(n-1)+h(1){\times}h(n-2)+{\cdots}+h(n-1){\times}h(0)$ $h(n)=\frac{h(n-1){\times}(4{\times}n-2)}{n+1}$ $h(n)=C_{2{\tim

3D math primer for graphics and game development

三角网格(Triangle Mesh) 最简单的情形,多边形网格不过是一个多边形列表:三角网格就是全部由三角形组成的多边形网格.多边形和三角网格在图形学和建模中广泛使用,用来模拟复杂物体的表面,如建筑.车辆.人体,当然还有茶壶等.图14.1给出一些例子: 当然,任意多边形网格都能转换成三角网格,三角网格以其简单性而吸引人,相对于一般多边形网格,许多操作对三角网格更容易. 1 表示网格 三角网格为一个三角形列表,所以最直接的表示方法是用三角形数组: Listing 14.1: A trivial

[HNOI2011]卡农

题目描述 众所周知卡农是一种复调音乐的写作技法,小余在听卡农音乐时灵感大发,发明了一种新的音乐谱写规则.他将声音分成 n 个音阶,并将音乐分成若干个片段.音乐的每个片段都是由 1 到 n 个音阶构成的和声,即从 n 个音阶中挑选若干个音阶同时演奏出来.为了强调与卡农的不同,他规定任意两个片段所包含的音阶集合都不同.同时为了保持音乐的规律性,他还规定在一段音乐中每个音阶被奏响的次数为偶数.现在的问题是:小余想知道包含 m 个片段的音乐一共有多少种.两段音乐 a 和 b 同种当且仅当将 a 的片段重

BZOJ1049 [HAOI2006]数字序列0

本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000作者博客:http://www.cnblogs.com/ljh2000-jump/转载请注明出处,侵权必究,保留最终解释权! Description 现在我们有一个长度为n的整数序列A.但是它太不好看了,于是我们希望把它变成一个单调严格上升的序列.但是不希望改变过多的数,也不希望改变的幅度太大. Input 第一行包含一个数n,接下来n个整数按顺序描述每一项的键值.n<=35000

COJ 0346 WZJ的旅行(二)

WZJ的旅行(二) 难度级别:D: 运行时间限制:3000ms: 运行空间限制:51200KB: 代码长度限制:2000000B 试题描述 时隔多日,WZJ又来到了幻想国旅行.幻想国由N个城市组成,由于道路翻修,只有N-1条双向道路可以通行,第i条双向道路从ui连接到vi,距离为wi.但这N-1条道路竟然连接了整个国家,每两个城市之间都有一条道路! WZJ知道这里景点很多,所以他想从城市s出发到城市t,旅游所有沿途的城市.WZJ想起到锻炼作用,但又不想太累,所以城市s到城市t的距离必须在L到R之

奇异值分解(We Recommend a Singular Value Decomposition)

奇异值分解(We Recommend a Singular Value Decomposition) 原文作者:David Austin原文链接: http://www.ams.org/samplings/feature-column/fcarc-svd译者:richardsun(孙振龙) 在这篇文章中,我们以几何的视角去观察矩阵奇异值分解的过程,并且列举一些奇异值分解的应用. 介绍 矩阵奇异值分解是本科数学课程中的必学部分,但往往被大家忽略.这个分解除了很直观,更重要的是非常具有实用价值.譬如