首页 > 其他分享 >计数问题的思考方法

计数问题的思考方法

时间:2024-11-11 19:43:38浏览次数:1  
标签:frac 2s text sum 容斥 choose 思考 计数问题 方法

计数问题的思考方法

——以《[ARC102E] Stop. Otherwise...》为例

DP

如果要使用 DP,则重点在其状态的设计,即我已经考虑了什么,当前正在考虑什么,通过一个不断将考虑范围扩大的方法,得到答案。

在转移的过程中,往往通过当前决策点的不同状态,从不同的状态转移过来(或转移到不同的状态),以得到不同的方案数。

最后根据转移方程进行优化。

DP的优势在于灵活,使得其可以应对各种复杂的问题。

在这道题中, \(f_{i,j}\) 表示考虑前 \(i\) 对数,选择了 \(j\) 个数的方案数。那么这对数可以不选,或者选 \(1\) 个,\(2\) 个, \(3\) 个……以此进行转移。同理 \(g_{i,j}\) 表示考虑了 \(i\) 个没有限制的数,其中选择了 \(j\) 个的方案数。对转移前缀和优化即可在时间限制内得到答案。

参考:[AT4362] [ARC102C] Stop. Otherwise... - 洛谷专栏 (luogu.com.cn)

组合计数

即直接考虑将题目抽象为组合式,再以数学方法或预处理等算法进行优化。

如果要使用这种方法,一定要使用正确的组合意义与推式子技巧,在枚举的时候应该使用组合意义相近的变量,使得式子得到简化。

组合计数的优势在于简单易懂,只要式子推对了,不容易出错。

对于这道题而言,对与计算和不等于 \(s\) 的答案,可以直接枚举出现了几种点对,有式子:

\[\begin{aligned} ans&=\sum_{i=0}^{s}\sum_{j=0}^s{n-1\choose i+j-1}{s\choose i}{k-2s\choose j}2^i \\&=\sum_{i=0}^{s}2^i{s\choose i}\sum_{j=0}^{k-2s}{n-1\choose n-i-j}{k-2s\choose j} \\&=\sum_{i=0}^s2^i{s\choose i}{n-1+k-2s\choose n-i} \end{aligned} \]

最后一步由范德蒙德下指标卷积可得,单次复杂度 \(\mathcal O(s)\) 可以计算。

其实这道题有很多种但是这一种,由于所枚举的 \(i,j\) 是意义相关的两种(即特殊的选择几种,非特殊的选择几种),所以其表达式类似,往往可以简单的进行优化。

不用最后一步的暴力方法需要对 \(k<2s\) 特判,但最后使用了卷积后就不用了。

附上常用组合公式:

范德蒙德卷积及其推论:如果两个都为正,可以利用 \({n\choose m}={n\choose n-m}\) 将其中一个取反。

\[\sum_{i=0}^{r}{n\choose i}{m\choose r-i}={n+m\choose r} \\\sum_{i=-r}^s{n\choose r+i}{m\choose s-i}={n+m\choose r+s} \]

错位式:

\[{n\choose r}{r\choose k}={n\choose k}{n-k\choose r-k} \]

连续上指标求和:

\[\sum_{l=k}^n{l\choose k}={n+1\choose k+1} \]

带权和:

\[\sum_{i=0}^ni^k{n\choose i}=n^{\overline k}2^{n-k} \]

参考:

排列组合 - OI Wiki (oi-wiki.org)

ARC102E Stop. Otherwise... 题解 - 洛谷专栏 (luogu.com.cn)

生成函数

生成函数最关键的就是考虑清楚对象大小函数,通过多项式的运算得到答案。

统计取到一定大小函数的方案数。

生成函数的优势在于推导方式灵活,较不容易出错,并且可以使用 \(FFT\) 优化到 \(\mathcal O(n\log n)\)

比如这道题,考虑不能出现的数为奇数 \(X=2s+1\) 的情况,,观察有限制的数组这一对象,其为 \(\{i,T-i\}\) 这个组,我们可以当作一个处理,最后再乘以二,则其为 \(A(x)= x\),即大小函数为 \(1\) ,方案数为 \(1\)。

那么对其进行 \(\text{SEQ}\) 构造,则 \(\text{SEQ}(A(x))=\frac 1{1-A(x)}=\frac 1{1-x}\),最后乘二,但是不选的那种算重了,所以生成函数为 \(\text{SEQ}(B(x))=\frac 2{1-x}-1=\frac {1+x}{1-x}\)。对于没有特殊限制的组,其为 \(\text{SEQ}(B(x))=\frac{1}{1-x}\),最后答案是整个对象的 \(\text{MEST}\) 构造,即 \(\text{SEQ}\) 构造的乘积,最后为 \((\frac {1-x}{1+x})^{s}(\frac 1{1-x})^{k-2s}\),偶数的情况稍作特判可得。

直接动态维护上述式子做到 \(\mathcal O(nk)\)。

参考:

符号化方法 - OI Wiki (oi-wiki.org)

题解:AT_arc102_c [ARC102E] Stop. Otherwise... - 洛谷专栏 (luogu.com.cn)

容斥反演

容斥是通过其实是通过数学原理简化限制,从全部满足,变成存在一个不满足。

使用容斥也需要找到真正的限制对象是什么,做到刚好不满足,可以将复杂的限制容斥掉,保留简单的,容易满足的限制以符合定义,得到正确的答案。

容斥原理的优势在于避其锋芒,可以有效的转化限制,处理全部要求类的问题。

反演则是容斥的进一步深化,特殊化,总结出固定的式子,做到恰好,至多,至少之间的转化。

这道题使用容斥原理,设 \(x=2s+1\),则钦定有 \(i\) 组数不能选的方案数,答案为:

\(\sum_{i=1}^s(-1)^i{s\choose i}2^{x-i}{K-s-i-2+n\choose n}\),对于 \(x\) 为偶数的情况同理特判加上选择 \(\frac x2\) 的方案数。

参考:容斥原理ARC102C 题解 - 洛谷专栏 (luogu.com.cn)

标签:frac,2s,text,sum,容斥,choose,思考,计数问题,方法
From: https://www.cnblogs.com/lupengheyyds/p/18540423

相关文章

  • 方法重载 v.s. 方法重写
    方法重载(overload)v.s.方法重写(override)��在Java中,方法重载(Overloading)和方法重写(Overriding)是两种不同的概念,它们在用途和实现方式上都有所不同。方法重载(Overloading)定义:方法重载是指在同一个类中存在多个方法名相同但参数列表不同(参数数量不同或参数类型不同)的方法......
  • 4-5-1.C# 数据容器 - Stack(Stack 的定义、Stack 元素的基本操作、Stack 元素的遍历、S
    Stack概述Stack<T>遵循后进先出的规则存储元素Stack<T>支持泛型,可以指定存储的元素的类型Stack<T>不是线程安全的,在多线程环境中需要谨慎使用一、Stack的定义定义StackStack<int>nums=newStack<int>();定义Stack并填充一些元素Stack<int>nums......
  • 4-4-1.C# 数据容器 - Queue(Queue 的定义、Queue 元素的基本操作、Queue 元素的遍历、Q
    Queue概述Queue<T>遵循先进先出的规则存储元素Queue<T>支持泛型,可以指定存储的元素的类型Queue<T>不是线程安全的,在多线程环境中需要谨慎使用一、Queue的定义定义QueueQueue<int>nums=newQueue<int>();定义Queue并填充一些元素Queue<int>nums=......
  • 4-3-1.C# 数据容器 - Dictionary(Dictionary 的定义、Dictionary 元素的基本操作、Dict
    Dictionary概述Dictionary<TKey,TValue>存储的是键值对(Key-Value),通过键(Key)来存储或修改值(Value)Dictionary<TKey,TValue>存储的键值对是无序的Dictionary<TKey,TValue>存储的键是不可重复的Dictionary<TKey,TValue>支持泛型,可以指定存储的键值对的类型D......
  • 解决 VSCode 中 C/C++ 编码乱码问题的两种方法
    解决VSCode中C/C++编码乱码问题的两种方法在中国地区,Windows系统中的cmd和PowerShell默认编码是GBK,但VSCode默认使用UTF-8编码。这种编码不一致会导致在VSCode终端中运行C/C++程序时出现乱码。以下介绍两种方法来解决这一问题。方法一:通过CodeRunner......
  • 地下水数值模拟软件Visual MODFLOW Flex安装,PEST操作方法,Aquifer Test抽水试验设计,地
    主要围绕的目前应用较为广泛的VisualModflowFlex6.1软件版本开展,结合具体应用场景,实例讲解软件的全流程应用过程,包括数据处理分析、数值模型构建以及模拟结果的输出等。本教程有助于提升技术人员地下水模拟软件的操作能力,解决地下水数值模拟技术实施过程中遇到的困难。同时,......
  • 部署神经网络时计算图的优化方法
    部署神经网络时计算图的优化方法部署神经网络时,各路框架基本都会把神经网络的计算建模为一个(有向无环的)计算图,之后再对这个计算图进行优化,包括硬件相关的优化和硬件无关的优化。本文介绍几种部署神经网络时计算图的优化方法,帮助读者在部署神经网络时理解部署工具都干了些什......
  • REBACCA网络推断方法
    REBACCA(REconstructionofBacterialCommunityCompositionthroughAdjustmentforCompositionallyConfoundedAssociations)是一种用于分析微生物组组成数据的新方法,专门设计用于减轻组成效应对关联分析的干扰。REBACCA可以从相对丰度数据中推断物种间的真实关联性,避免组成效......
  • Linux kernel 堆溢出利用方法(二)
    前言本文我们通过我们的老朋友heap_bof来讲解Linuxkernel中off-by-null的利用手法。在通过讲解另一道相对来说比较困难的kerneloff-by-null+dockerescape来深入了解这种漏洞的利用手法。(没了解过docker逃逸的朋友也可以看懂,毕竟有了root权限后,docker逃逸就变的相对简单了)。......
  • PG 修改表结构提示有试图依赖的处理方法
     ALTERTABLEvictimALTERCOLUMNvictim_belong_urlTYPEvarchar(1000)USINGvictim_belong_url::varchar(1000); 修改字段长度通过修改pg_attribute基表的方式来绕开这个限制  #通过表名查出attrelidSELECTrelname,attname,attnum,attrelid,attnameFR......