D e s c r i p t i o n D e s c r i p t i o n
Link .
对于 x ∈ N ∗ x ∈ N ∗ ,令 s ( x ) s ( x ) 表示将 x x 十进制下的各位数码排序后得到的十进制数的值。求 ∑ X i = 1 s ( i ) ∑ i = 1 X s ( i ) 对 ( 10 9 + 7 ) ( 10 9 + 7 ) 取模的结果。
X ≤ 10 700 X ≤ 10 700 。
S o l u t i o n S o l u t i o n
下记 m = 10 m = 10 (进制),n = ⌈ log m X ⌉ n = ⌈ log m X ⌉ 。
C a s e 1 C a s e 1
市面上的题解做法。
考虑到“数码有序”的特性:∀ x , s ( x ) ∀ x , s ( x ) 可以表示为若干个 11 … 1 11 … 1 之和。对于 d ∈ [ 1 , 9 ] d ∈ [ 1 , 9 ] ,d d 显然在 s ( x ) s ( x ) 中占有连续的一段,那么 s ( x ) s ( x ) 有形如 ∑ d d d … d a 00 … 0 b ∑ d d d … d ⏟ a 00 … 0 ⏟ b 的形式,其中 a a 表示 d d 的个数,b b 表示大于 d d 的数码个数。根据上述特性,它可以转化为 ∑ d 11 … 1 a 11 … 1 b ∑ d 11 … 1 ⏟ a 11 … 1 ⏟ b ,就能直接 DP 计算啦。
令 f d ( i , j , 0 / 1 ) f d ( i , j , 0 / 1 ) 表示当前的 x x 填到了从高到低第 i i 位,且有 j j 个数码大于等于 d d ,是否被 X X 限制的方案数,转移枚举第 i + 1 i + 1 位所填的数码即可。最终答案为
m − 1 ∑ d = 1 n ∑ l = 1 ( 11 … 1 l ) f d ( n , l , 0 ) + f d ( n , l , 1 ) ∑ d = 1 m − 1 ∑ l = 1 n ( 11 … 1 ⏟ l ) f d ( n , l , 0 ) + f d ( n , l , 1 )
复杂度 O ( m 2 n 2 ) O ( m 2 n 2 ) 。
C a s e 2 C a s e 2
一种粗暴但是实用的 GF 做法。
本节记 v i = 11 … 1 i v i = 11 … 1 ⏟ i 。
对于上界 X X ,不管什么做法都很难带着这种限制算。考虑枚举 x x 中从高到低第一个严格小于 X X 的数码位置 p p —— 即 x x 的第 1 ∼ p − 1 1 ∼ p − 1 位与 X X 相同,第 p p 位小于 X X 。同时,记 c i c i 示 X X 的 1 ∼ p − 1 1 ∼ p − 1 位中数码 i i 的出现次数,它们在 x x 中亦出现,且位置已经固定。当然,还需要枚举第 p p 位的值。
注意到 x x 的第 p + 1 ∼ n p + 1 ∼ n 位已经不必担心限制,可以用单纯的计数 DP 而非数位 DP 进行求解。我们以 1 ∼ 9 1 ∼ 9 的顺序将数码填入这 n − p n − p 个位置中,没填的位置视为 0 0 (不影响 s ( x ) s ( x ) 的值),设 DP 状态:
g i , j g i , j 表示用 1 ∼ i 1 ∼ i 的数码填 j j 个位置的方案数;
f i , j f i , j 表示用 1 ∼ i 1 ∼ i 的数码填 j j 个位置,得到的所有 x x 的 s ( x ) s ( x ) 之和。(再次强调,没填的位置视为 0 0 )。
对于 g i , j g i , j 的转移,枚举数码 i i 的个数,得到
g i , j = j ∑ k = 0 ( j k ) g i − 1 , j − k g i , j = ∑ k = 0 j ( j k ) g i − 1 , j − k
对于 f i , j f i , j 的转移,数码 i i 会把 s ( x ) s ( x ) 本来的值整体向高位位移(因为 s ( x ) s ( x ) 当时只有 1 ∼ i − 1 1 ∼ i − 1 的数码,都小于 i i ),然后低位补上 d d … d d d … d 。具体有
f i , j = j ∑ k = 0 ( j k ) ( f i − 1 , j − k ⋅ m k + c i + g i − 1 , j − k ⋅ i v k + c i ) f i , j = ∑ k = 0 j ( j k ) ( f i − 1 , j − k ⋅ m k + c i + g i − 1 , j − k ⋅ i v k + c i )
我们可以用它们表示出当前 p p 对答案的贡献 ans p ans p 为:
ans p = n − p ∑ k = 0 ( n − p k ) f m − 1 , k ans p = ∑ k = 0 n − p ( n − p k ) f m − 1 , k
注意 f m − 1 , k f m − 1 , k 中的 k k 只考虑了内部选位置的方案,所以外面还得带一个组合数。
DP 在此告一段落,如此暴力求答案的复杂度是枚举前缀的 O ( n m ) O ( n m ) 套 DP 的 O ( n 2 m ) O ( n 2 m ) 即 O ( m 2 n 3 ) O ( m 2 n 3 ) 的。
接下来引入 EGF,令
G i ( x ) = n − p − 1 ∑ j = 0 g i , j x j F i ( x ) = n − p − 1 ∑ j = 0 f i , j x j G i ( x ) = ∑ j = 0 n − p − 1 g i , j x j F i ( x ) = ∑ j = 0 n − p − 1 f i , j x j
尝试化简它们,从递推式入手:
g i , j = j ∑ k = 0 ( j k ) g i − 1 , j − k ⇒ g i , j j ! = j ∑ k = 0 g i − 1 , j − k ( j − k ) ! ⋅ 1 k ! g i , j = ∑ k = 0 j ( j k ) g i − 1 , j − k ⇒ g i , j j ! = ∑ k = 0 j g i − 1 , j − k ( j − k ) ! ⋅ 1 k !
后者很显然是一个卷积形式,套入 EGF 就有:
⇒ [ x j ] G i ( x ) = j ∑ k = 0 [ x j − k ] G i − 1 ( x ) ⋅ [ x k ] e x ⇒ G i ( x ) = e x G i − 1 ( x ) ⇒ G i ( x ) = e i x ⇒ [ x j ] G i ( x ) = ∑ k = 0 j [ x j − k ] G i − 1 ( x ) ⋅ [ x k ] e x ⇒ G i ( x ) = e x G i − 1 ( x ) ⇒ G i ( x ) = e i x
类似的,对于 F F 有
f i , j = j ∑ k = 0 ( j k ) ( m k + c i f i − 1 , j − k + g i − 1 , j − k ⋅ i v k + c i ) ⇒ f i , j j ! = j ∑ k = 0 ( m c i m k k ! ⋅ f i − 1 , j − k ( j − k ) ! + i ⋅ g i − 1 , j − k ( j − k ) ! ⋅ m c i v k + v c i k ! ) ⇒ F i ( x ) = m c i e m x F i − 1 ( x ) + i G i − 1 ( x ) ( m c i V ( x ) + v c i e x ) , let V ( x ) = + ∞ ∑ i = 0 v i x i ⇒ F i ( x ) = m c i e m x F i − 1 ( x ) + i e ( i − 1 ) x ( m c i V ( x ) + v c i e x ) f i , j = ∑ k = 0 j ( j k ) ( m k + c i f i − 1 , j − k + g i − 1 , j − k ⋅ i v k + c i ) ⇒ f i , j j ! = ∑ k = 0 j ( m c i m k k ! ⋅ f i − 1 , j − k ( j − k ) ! + i ⋅ g i − 1 , j − k ( j − k ) ! ⋅ m c i v k + v c i k ! ) ⇒ F i ( x ) = m c i e m x F i − 1 ( x ) + i G i − 1 ( x ) ( m c i V ( x ) + v c i e x ) , let V ( x ) = ∑ i = 0 + ∞ v i x i ⇒ F i ( x ) = m c i e m x F i − 1 ( x ) + i e ( i − 1 ) x ( m c i V ( x ) + v c i e x )
发现这是关于 F i ( x ) F i ( x ) 的常系数线性递推,令
p i = m c i e m x q i = i e ( i − 1 ) x ( m c i V ( x ) + v c i e x ) p i = m c i e m x q i = i e ( i − 1 ) x ( m c i V ( x ) + v c i e x )
则
F i ( x ) = p i F i − 1 ( x ) + q i F i ( x ) = p i F i − 1 ( x ) + q i
美观多啦,手代一下就能展开成通项:
F i ( x ) = i ∑ k = 1 q k i ∏ j = k + 1 p j F i ( x ) = ∑ k = 1 i q k ∏ j = k + 1 i p j
进一步,代入 ans p ans p 的式子:
ans p ( n − p ) ! = [ x n − p ] e x F m − 1 ( x ) = [ x n − p ] e x m − 1 ∑ k = 1 q k m − 1 ∏ j = k + 1 p j = [ x n − p ] m − 1 ∑ k = 1 ( k e k x ( m c k V ( x ) + v c k e x ) ) ⎛ ⎝ m − 1 ∏ j = k + 1 m c j e m x ⎞ ⎠ = [ x n − p ] m − 1 ∑ k = 1 k ⎛ ⎝ m − 1 ∏ j = k + 1 m c j ⎞ ⎠ ( m c k e ( m ( m − 1 − k ) + k ) x V ( x ) + v c k e ( m ( m − 1 − k ) + k + 1 ) x ) ans p ( n − p ) ! = [ x n − p ] e x F m − 1 ( x ) = [ x n − p ] e x ∑ k = 1 m − 1 q k ∏ j = k + 1 m − 1 p j = [ x n − p ] ∑ k = 1 m − 1 ( k e k x ( m c k V ( x ) + v c k e x ) ) ( ∏ j = k + 1 m − 1 m c j e m x ) = [ x n − p ] ∑ k = 1 m − 1 k ( ∏ j = k + 1 m − 1 m c j ) ( m c k e ( m ( m − 1 − k ) + k ) x V ( x ) + v c k e ( m ( m − 1 − k ) + k + 1 ) x )
卡住啦,瓶颈在于求 e ( m ( m − 1 − k ) + k ) x V ( x ) e ( m ( m − 1 − k ) + k ) x V ( x ) 。来看看 V ( x ) V ( x ) 是什么……
V ( x ) = + ∞ ∑ i = 0 m i − 1 m − 1 ⋅ x i i ! = 1 m − 1 ( e m x − e x ) = e x m − 1 ( e ( m − 1 ) x − 1 ) V ( x ) = ∑ i = 0 + ∞ m i − 1 m − 1 ⋅ x i i ! = 1 m − 1 ( e m x − e x ) = e x m − 1 ( e ( m − 1 ) x − 1 )
大力丢进去,有
e ( m ( m − 1 − k ) + k ) x V ( x ) = 1 m − 1 e ( m ( m − 1 − k ) + k + 1 ) x ( e ( m − 1 ) x − 1 ) e ( m ( m − 1 − k ) + k ) x V ( x ) = 1 m − 1 e ( m ( m − 1 − k ) + k + 1 ) x ( e ( m − 1 ) x − 1 )
天呐它果然封闭,可以 O ( 1 ) O ( 1 ) 算系数。那么整个算法就是 O ( n m ) O ( n m ) 枚举 p p 套 O ( m ) O ( m ) 求 ans p ans p ,即 O ( m 2 n ) O ( m 2 n ) 的。
C a s e 3 C a s e 3
来冷静并反复刺激一下大脑叭~
研究某个 x x 及其 s ( x ) s ( x ) ,设 x x 中数码出现次数为 c 0..9 c 0..9 ,则
s ( x ) = m − 1 ∑ i = 1 m ∑ m − 1 j = i c j − 1 m − 1 s ( x ) = ∑ i = 1 m − 1 m ∑ j = i m − 1 c j − 1 m − 1
实质上就是 C a s e 1 C a s e 1 中 11 … 1 11 … 1 的转化。然后类似 C a s e 2 C a s e 2 地,枚举 x x 与 X X 的相同前缀及下一位严格小于 X X 的数码。还是记枚举的位置 p p ,前缀中数码出现次数为 c 0..9 c 0..9 。把上式 ∑ m − 1 j = i c j ∑ j = i m − 1 c j 处理为后缀和 s i s i ,那么 ans p ans p 有
ans p = 1 m − 1 m − 1 ∑ i = 1 n − p ∑ j = 0 ( n − p j ) ( i − 1 ) n − p − j ( m − i ) p ( m s i + j − 1 ) ans p = 1 m − 1 ∑ i = 1 m − 1 ∑ j = 0 n − p ( n − p j ) ( i − 1 ) n − p − j ( m − i ) p ( m s i + j − 1 )
注意其中 j j 枚举的是“大于等于 i i 的数码个数”。瞪一下和式里面,显然可以把形如二项式展开的这一坨拍回去。记 l = n − p l = n − p ,推一推:
l ∑ j = 0 ⋯ = m s i l ∑ j = 0 ( l j ) ( i − 1 ) l − j ( m − i ) j m j − ( m − 1 ) l = m s i ( m ( m − i ) + i − 1 ) l − ( m − 1 ) l ∑ j = 0 l ⋯ = m s i ∑ j = 0 l ( l j ) ( i − 1 ) l − j ( m − i ) j m j − ( m − 1 ) l = m s i ( m ( m − i ) + i − 1 ) l − ( m − 1 ) l
扫前缀的过程中顺带维护一下这个式子,Tiw: 可以做到 O ( m n ) O ( m n ) 。
由于有些算法没写,所以都不给代码啦 awa~
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现