每次都因为睡觉搁置了写笔记的安排,这次一定不能咕。
好吧就是抄了一遍 PPT,q-Lucas 的证明之后抄飘飘的。
q-analog(即 q-模拟),是对于一个对象 u u 构造一个关于 q q 的表达式 f ( q ) f ( q ) ,使得:
lim q → 1 f ( q ) = u lim q → 1 f ( q ) = u
这是一个比较 general 的定义。这里 q q 可以是一个形式幂级数,也可以是一个比较具体的值,可以具体问题具体分析带入合适的 q q 。实际上 q q 的意义就是对同一个对象附上不同的组合意义,得到一个生成函数或者是一个具体对象;而 q = 1 q = 1 的时候这个具体的对象刚好就是 u u 。
好吧,比较抽象。我们先举出几个比较简单的对象的 q-analog。
对于一个正整数 n n ,定义其 q - i n t e g e r q - i n t e g e r 为 n − 1 ∑ i = 0 q i = 1 − q n 1 − q ∑ i = 0 n − 1 q i = 1 − q n 1 − q ,记做 [ n ] q [ n ] q 。
验证容易发现,在 q q 趋近于 1 1 的时候,[ n ] q = n [ n ] q = n (可以直接洛)。
对于一个正整数 n n ,定义其 q - f r a c t i o n a l q - f r a c t i o n a l 为 [ n ] q ! = n ∏ i = 1 [ i ] q [ n ] q ! = ∏ i = 1 n [ i ] q 。
这个展开的形式也比较简便,就不费这点心思写公式了。
对于两个非负整数 n , m ( n > m ) n , m ( n > m ) ,定义其 q - b i n o m i a l c o e f f i c i e n t q - b i n o m i a l c o e f f i c i e n t 为 [ n m ] q = [ n ] q ! [ m ] q ! [ n − m ] q ! = [ n n − m ] q [ n m ] q = [ n ] q ! [ m ] q ! [ n − m ] q ! = [ n n − m ] q 。
不知道有没有什么广义二项式系数的 q-模拟,既然是初探那就暂时不管吧!
对于一个非负整数 n n 以及一组和为 n n 的非负整数 a 1 , a 2 , ⋯ , a k a 1 , a 2 , ⋯ , a k ,定义其 q - p o l y n o m i a l c o e f f i c i e n t q - p o l y n o m i a l c o e f f i c i e n t 为 [ n a 1 , a 2 , ⋯ , a k ] q = [ n ] q ! [ a 1 ] q ! [ a 2 ] q ! ⋯ [ a k ] q ! [ n a 1 , a 2 , ⋯ , a k ] q = [ n ] q ! [ a 1 ] q ! [ a 2 ] q ! ⋯ [ a k ] q ! 。
可以对照组合数理解。容易发现 q = 1 q = 1 的时候就是组合数,现在能否理解 q-模拟 想做的事情了?
如果看到下面没有 q q 的下标自动补上就好了 ×
接下来研究一些定理。主要研究二项式系数。
定理 1:记 S n S n 为所有 n n 阶排列构成的集合,τ ( p ) τ ( p ) 为排列 p p 的逆序对数,有:
∑ p ∈ S n q τ ( p ) = [ n ] q ! ∑ p ∈ S n q τ ( p ) = [ n ] q !
证明:
有一个结论是,记 c i c i 为排列中以 i i 为第二个元素的逆序对个数(就是逆序对 ( x , i ) , x < i ( x , i ) , x < i 的个数),那么一个序列 c c 和一个排列唯一对应,反之亦然(可以看这个题 )。
继续分析 [ n ] q ! [ n ] q ! 本身。容易发现 [ i ] q [ i ] q 的生成函数相当于在枚举 c i c i ,对应每一个排列,定理得证。
可以写出一个代数证明,但是我懒了。
定理 1.5:记 S n S n 为 a 1 a 1 个 1 1 ,a 2 a 2 个 2 2 ,……,a k a k 个 k k 构成的排列集合,τ ( p ) τ ( p ) 为序列 p p 的逆序对数,有:
∑ p ∈ S n q τ ( p ) = [ n a 1 , a 2 , ⋯ , a k ] q ∑ p ∈ S n q τ ( p ) = [ n a 1 , a 2 , ⋯ , a k ] q
此定理 k = 2 k = 2 的特殊情况将在之后证明,k > 2 k > 2 的情况可以推广而来不再证明。
定理 2:(排列从 1 1 开始编号)记 τ ( p ) = ∑ i ∈ S p i τ ( p ) = ∑ i ∈ S p i ,其中 S p = { i ∣ p i > p i + 1 } S p = { i ∣ p i > p i + 1 } 。记 S n S n 为 a 1 a 1 个 1 1 ,a 2 a 2 个 2 2 ,……,a k a k 个 k k 构成的排列集合,有:
∑ p ∈ S n q τ ( p ) = [ n a 1 , a 2 , ⋯ , a k ] q ∑ p ∈ S n q τ ( p ) = [ n a 1 , a 2 , ⋯ , a k ] q
容易发现形式和定理 1.5 的形式一模一样。这说明了降位和和逆序对的分布是相同的。这个给出一个合理的组合意义解释非常困难,可以看论文 。
定理 3:若 n ≥ 1 n ≥ 1 ,则有 [ n m ] q = [ n − 1 m − 1 ] q + q m [ n − 1 m ] q [ n m ] q = [ n − 1 m − 1 ] q + q m [ n − 1 m ] q 。
有简单的代数证明,但是代数推导天地灭,这不优秀啊!
我们先假定这个是对的,带入 n = n + m n = n + m ,可以得到:
[ n + m n ] q = [ n + m − 1 m − 1 ] q + q m [ n + m − 1 m ] q = q n [ n + m − 1 n ] q + [ n + m − 1 n − 1 ] q [ n + m n ] q = [ n + m − 1 m − 1 ] q + q m [ n + m − 1 m ] q = q n [ n + m − 1 n ] q + [ n + m − 1 n − 1 ] q 。
这个式子显然跟我们的定理等价。记网格图上从 ( 0 , 0 ) ( 0 , 0 ) 只向上或向右到 ( n , m ) ( n , m ) 的路径的集合为 S S ,路径 p p 右下角(或左上角)的格子个数为 τ ( p ) τ ( p ) ,容易发现 [ n + m n ] q = ∑ p ∈ S q τ ( p ) [ n + m n ] q = ∑ p ∈ S q τ ( p ) 。这给出了一个递推式的形式,容易发现初值对应,定理得证。
然后是 q - C a t a l a n q - C a t a l a n 。有 Cat ( n ) q = [ 2 n n ] q [ n + 1 ] q = [ 2 n n ] q − [ 2 n n + 1 ] q Cat ( n ) q = [ 2 n n ] q [ n + 1 ] q = [ 2 n n ] q − [ 2 n n + 1 ] q 。
给它一个组合意义:记所有长度为 2 n 2 n 的合法出入栈序列集合为 S S ,τ ( p ) τ ( p ) 为序列 p p 的降位和,则 Cat ( n ) q = ∑ p ∈ S q τ ( p ) Cat ( n ) q = ∑ p ∈ S q τ ( p ) 。
定理 4(q q -二项式定理):
n − 1 ∏ i = 0 ( 1 + q i y ) = n ∑ i = 0 q i ( i − 1 ) 2 [ n i ] q y i ∏ i = 0 n − 1 ( 1 + q i y ) = ∑ i = 0 n q i ( i − 1 ) 2 [ n i ] q y i
我们继续考虑一个组合意义。[ y c ] ∏ n − 1 i = 0 ( 1 + q i y ) [ y c ] ∏ i = 0 n − 1 ( 1 + q i y ) 相当于一个 n n 列的直方图,第 i i 列共有 i − 1 i − 1 个格子,选 c c 列出来。对于选出来的 c c 列,先把选出来的第 i i 列上面 i − 1 i − 1 个格子削掉(共有 i ( i − 1 ) 2 i ( i − 1 ) 2 个格子,容易发现不存在没有东西削的情况),然后剩下的所有列,上一列一定不比当前列高。这样的话就是算从 ( 0 , 0 ) ( 0 , 0 ) 走到 ( c , n − c ) ( c , n − c ) 所有路径的权值,一条路径的权值定义为,设其右下角的格子个数为 c c ,q c q c (总之就是直接沿用二项式系数的定义),那么显然就是 [ n i ] c [ n i ] c 。
定理 5:
[ n + m k ] q = k ∑ i = 0 q ( n − i ) ( k − i ) [ n i ] q [ m k − i ] q [ n + m k ] q = ∑ i = 0 k q ( n − i ) ( k − i ) [ n i ] q [ m k − i ] q
类似于范德蒙德卷积。
再给一个组合意义证明。[ n + m k ] q [ n + m k ] q 可以用 n + m n + m 个数里有 k k 个 1 1 ,然后用逆序对(实际上在这里取用的是顺序对)那套意义去理解。和式里面就是枚举前 n n 个里面有 i i 个 1 1 ,算左右两边的逆序对,然后补上两块之间的逆序对。
定理 6:
[ n + m + 1 n + 1 ] q = m ∑ i = 0 q i [ n + i n ] q [ n + m + 1 n + 1 ] q = ∑ i = 0 m q i [ n + i n ] q
使用定理 3,重复展开即可证明。组合意义也是考虑走网格图,比较通用的证明方法。
定理 7(q q -二项式定理-负指数形式):
n − 1 ∏ i = 0 1 1 − q i x = + ∞ ∑ i = 0 [ n + i − 1 i ] q x i ∏ i = 0 n − 1 1 1 − q i x = ∑ i = 0 + ∞ [ n + i − 1 i ] q x i
还是考虑 [ x c ] ∏ n − 1 i = 0 1 1 − q i x [ x c ] ∏ i = 0 n − 1 1 1 − q i x 。相当于 c c 列,每列都不大于 n n 的直方图,以格子大小为指数,也即从 ( 0 , 0 ) → ( i , n − 1 ) ( 0 , 0 ) → ( i , n − 1 ) 所有路径的权值,一条路径的权值定义为,设其右下角的格子个数为 c c ,q c q c (总之就是直接沿用二项式系数的定义)。想必不用我多说了吧。
定理 8(q - L u c a s q - L u c a s ):有一个模分圆多项式的基本形式,CRT 之后可以得到新形式(其中 n / d n / d 为 n n 除以 d d 向下取整的值):
[ n m ] q = ( n mod d m mod d ) [ n / d m / d ] q [ n m ] q = ( n mod d m mod d ) [ n / d m / d ] q
其中 q = e 2 c i π / d q = e 2 c i π / d ,且 gcd ( c , d ) = 1 gcd ( c , d ) = 1 。
证明不会。
要对于一个具体的 q q 算 q-二项式系数的值的话,令 d = ord ( q ) d = ord ( q ) ,有:
[ n m ] q = [ n / d m / d ] q ( n mod d m mod d ) [ n m ] q = [ n / d m / d ] q ( n mod d m mod d )
接下来研究 q-analog 的应用。首先要知道这些东西怎么算。
比如研究 [ n ] q ! [ n ] q ! 的前 k k 项(k ≤ n k ≤ n ),先展开:[ n ] q ! = ( 1 − q ) ( 1 − q 2 ) ⋯ ( 1 − q n ) ( 1 − q ) n [ n ] q ! = ( 1 − q ) ( 1 − q 2 ) ⋯ ( 1 − q n ) ( 1 − q ) n 。
法一:这个东西,显然可以使用多项式 exp exp 算,求导再求积(付公主的背包),时间复杂度 O ( n log n ) O ( n log n ) ,延展性并不强。
法二:背包,显然最多只能选 O ( √ k ) O ( k ) 个数,最后再做个多项式卷积,时间复杂度 O ( n √ n ) O ( n n ) ,复杂度取决于分母的计算复杂度。
法三:五边形数,显然这里有值的位置比较稀疏,仍然是多项式卷积,时间复杂度 O ( n √ n ) O ( n n ) 。
法四:杨表。不是很会这个东西。
法五:采用 q-二项式定理对分子变形:
[ n ] q ! = ( 1 − q ) ( 1 − q 2 ) ⋯ ( 1 − q n ) ( 1 − q ) n = n − 1 ∏ i = 0 ( 1 − q ⋅ q i ) = n ∑ i = 0 ( − 1 ) i q ( i + 1 ) i 2 [ n i ] q [ n ] q ! = ( 1 − q ) ( 1 − q 2 ) ⋯ ( 1 − q n ) ( 1 − q ) n = ∏ i = 0 n − 1 ( 1 − q ⋅ q i ) = ∑ i = 0 n ( − 1 ) i q ( i + 1 ) i 2 [ n i ] q
变形之后,如果算前 k k 项,那么 ∑ ∑ 的上指标就会缩减到 O ( √ k ) O ( k ) 级别。
然后考虑每一项的生成函数。注意到 [ n m + 1 ] q = [ n m ] q 1 − q n − m 1 − q m + 1 [ n m + 1 ] q = [ n m ] q 1 − q n − m 1 − q m + 1 (考虑 q-二项式系数 的定义)。这样的话就可以 O ( k ) O ( k ) 递推,总时间复杂度 O ( k √ k ) O ( k k ) 。
这样算 [ n ] q ! f ( q ) [ n ] q ! f ( q ) 也能 O ( k √ k ) O ( k k ) 算了,延展性比较高。
通过分拆数这个工具引出 [ n m ] q [ n m ] q 的另一个组合意义:
[ n m ] q = [ t n − m ] 1 1 − t m ∏ i = 1 1 1 − q i t [ n m ] q = [ t n − m ] 1 1 − t ∏ i = 1 m 1 1 − q i t
仍然考虑网格图,走出来的路径其实也就是一个 Ferrers 图像。上面的很多东西也可以这么解释。有个不用 q-analog,但是用到了 Ferrers 图像相关性质的题,可以看山河重整 - Sol 。
对于 q q 有具体取值的也可以做,具体考虑快速阶乘(复杂度 O ( √ n log n ) O ( n log n ) )的做法。
考虑一些有限域下的矩阵计数。有两个简单的小 intro:
求 F n q F q n (意思是 n n 维的模 q q 意义下的空间)的向量个数:显然是 q n q n 。
求 F n q F q n 上的 n × n n × n 的矩阵个数:显然是 q n 2 q n 2 。
然后再考虑一些比较难的问题。
求 F n q F q n 中大小为 k k 的线性无关向量组个数(顺序不同也认为不同):
第一个向量不能选零向量,方案数 q n − 1 q n − 1 ;第二个向量有两个不能选,方案数 q n − q q n − q ;第三个有四个不能选,方案数 q n − q 2 q n − q 2 ,以此类推。
记这个问题的答案为 ( ( n ) k ) q ( ( n ) k ) q 。显然有:
( ( n ) k ) q = k − 1 ∏ i = 0 ( q n − q i ) = q k ( k − 1 ) 2 n ∏ i = n − k + 1 ( q i − 1 ) = ( q − 1 ) k q k ( k − 1 ) 2 [ n ] q ! [ n − k ] q ! ( ( n ) k ) q = ∏ i = 0 k − 1 ( q n − q i ) = q k ( k − 1 ) 2 ∏ i = n − k + 1 n ( q i − 1 ) = ( q − 1 ) k q k ( k − 1 ) 2 [ n ] q ! [ n − k ] q !
求 F n q F q n 中的 k k 维子空间的个数(如果选出的向量张成出同一个子空间算一样的):
先钦定一组大小为 k k 的线性无关向量组当成这 k k 维子空间的基,方案数 ( ( n ) k ) q ( ( n ) k ) q ;注意到这时每个子空间会被算 ( ( k ) k ) q ( ( k ) k ) q 次,答案就是 ( ( n ) k ) q ( ( k ) k ) q ( ( n ) k ) q ( ( k ) k ) q 。
恰巧有一个结论是:
[ n k ] q = ( ( n ) k ) q ( ( k ) k ) q [ n k ] q = ( ( n ) k ) q ( ( k ) k ) q
结论容易验证,考虑组合解释:
[ n k ] q [ n k ] q 描述了 n n 个盒子放 m m 个球,方案数关于是否有球生成一个 01 序列逆序对的生成函数。
( ( n ) k ) q ( ( k ) k ) q ( ( n ) k ) q ( ( k ) k ) q 描述的是 k k 个行基向量消元后得到的 k × n k × n 的上三角矩阵 F F ,算不同的消元后的矩阵(对应不同的空间)。考虑每一列,如果这一列上出现了一个新的向量,那么方案数为 1 1 (消元过程已确定),否则方案数为已有向量的张成空间里任选一个的方案数,记前面有的 1 1 的个数为 p p ,方案数就是 q p q p 。
算了,能数的东西很多(比如可对角化矩阵计数之类的……),基本上都是一样的,用两个例题结束吧。
CF1603F October 18, 2017
问题等价于,给定 F k 2 F 2 k 上一个向量 v v ,有多少个 F k 2 F 2 k 上的大小为 n n 的向量组不能线性表示 v v 。k ≤ 10 7 , n ≤ 10 9 k ≤ 10 7 , n ≤ 10 9 。
这个题用组合数学的方法好像真的只评得上 2700,不是很懂。
用 q-analog 的方法考虑。
如果 v v 是零向量就非常好办,答案就是 ( ( k ) n ) 2 ( ( k ) n ) 2 ,这个可以 O ( k ) O ( k ) 算。
如果不是,我们先枚举 r r ,然后生成所有的大小为 r r 的不能线性表示 v v 的线性无关向量组。第一个向量不能是 v v 或者零向量,少了两种选择,第二个向量少了四种选择,类推可知方案数为 ( ( k ) r + 1 ) 2 2 k − 1 ( ( k ) r + 1 ) 2 2 k − 1 。
然后还有 n − r n − r 个向量可以随机插入,这 n − r n − r 个向量要被之前的向量线性表示,用生成函数的形式写出就是 [ x n − r ] r ∏ i = 0 1 1 − 2 i x [ x n − r ] ∏ i = 0 r 1 1 − 2 i x 。根据定理 7 可知这个就是 [ n r ] 2 [ n r ] 2 。
答案就是对所有的 r r 求和,都可以用 O ( k ) O ( k ) 的时间算出来。
LOJ562 Tangjz 的背包
题意:记 f ( v ) = [ x v y m ] n ∏ i = 1 ( 1 + x i y ) f ( v ) = [ x v y m ] ∏ i = 1 n ( 1 + x i y ) ,求 p ∑ v = 1 19190506 p − v f ( v ) ∑ v = 1 p 19190506 p − v f ( v ) ,其中 p p 是使得 f ( p ) ≠ 0 f ( p ) ≠ 0 的最大整数。多组询问,T ≤ 5 × 10 5 T ≤ 5 × 10 5 ,n , m ≤ 10 12 n , m ≤ 10 12 ,对 998244353 998244353 取模。
令 C = 19190506 C = 19190506 。浅推一波式子:
p ∑ v = 1 C p − v [ x v y m ] n ∏ i = 1 ( 1 + x i y ) = C p p ∑ v = 1 C − v [ x v y m ] n ∏ i = 1 ( 1 + x i y ) = C p p ∑ v = 1 [ x v y m ] n ∏ i = 1 ( 1 + ( C − 1 v ) i y ) = C p [ y m ] n ∏ i = 1 ( 1 + B − 1 y ) = C p − ( m + 1 ) ( m + 2 ) 2 [ n m ] C − 1 ∑ v = 1 p C p − v [ x v y m ] ∏ i = 1 n ( 1 + x i y ) = C p ∑ v = 1 p C − v [ x v y m ] ∏ i = 1 n ( 1 + x i y ) = C p ∑ v = 1 p [ x v y m ] ∏ i = 1 n ( 1 + ( C − 1 v ) i y ) = C p [ y m ] ∏ i = 1 n ( 1 + B − 1 y ) = C p − ( m + 1 ) ( m + 2 ) 2 [ n m ] C − 1
最后一步运用了定理 4。
现在问题是 p p 是多少了……显然 p = n ∑ i = n − m + 1 i p = ∑ i = n − m + 1 n i ,问题在于怎么算 n , m n , m 很大的情况下的二项式系数,可以用 q - L u c a s q - L u c a s 解决。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现