SDOI2010 代码拍卖会 草稿
题目大意:
给定这样一个定义:对于一个十进制数,如果这个数的数位从高到低非严格单调递增(即形如 111111.....2222...3333...4444.... 111111.....2222...3333...4444.... 111111.....2222...3333...4444....的数),那么就称这个数叫“同态数”;同态数数位的个数叫做同态数的长度。比如说 1112233456 1112233456 1112233456就是一个长度为 10 10 10的同态数,而 1112233431 1112233431 1112233431就不是。求一个长度为 N N N的同态数中,有多少是 P P P的倍数。 N ≤ 1 0 18 , P ≤ 500 , N \leq 10^{18},P\leq500, N≤1018,P≤500,答案对 999911659 999911659 999911659取余。
当
N
N
N和
P
P
P的值都很小的时候,可以考虑这样一种暴力DP做法:
设
F
(
i
,
j
,
k
)
F(i,j,k)
F(i,j,k)表示填完从右往左的第
i
i
i位,第
i
i
i位的数位为
j
j
j,对
P
P
P取模得
k
k
k的同态数个数。有这样一个方程:
F
(
i
,
j
,
k
)
=
∑
j
≤
p
≤
9
F
(
i
−
1
,
p
,
(
k
−
1
0
i
j
)
m
o
d
  
P
)
F(i,j,k)=\sum_{j \leq p \leq 9}F(i-1,p,(k-10^ij)\mod P)
F(i,j,k)=j≤p≤9∑F(i−1,p,(k−10ij)modP)
非严格的时间复杂度为
O
(
9
2
N
P
)
O(9^2NP)
O(92NP)。这个是过不了的:其主要原因在于
N
N
N的值过大!
既然如此,我们就只能考虑放弃数位DP,从另一个角度思考这个问题:把同态数进行拆分。
考虑长度为
N
N
N时,最小的同态数为
1111......111
(
N
个
1
)
1111......111(N\text{个}1)
1111......111(N个1)。任意一个同态数,似乎都可以拆分成若干个长度不同的
11111....111
11111....111
11111....111相加!根据这两个性质,我们定义一个概念:同态基。
定义同态基
β
i
=
1
0
i
−
1
9
\beta_i=\frac{10^i-1}{9}
βi=910i−1表示由连续的
i
i
i个
1
1
1组成的同态数。对于任意一个同态数,其均可以表示成
∑
i
=
1
N
r
i
β
i
\sum_{i=1}^{N}r_i\beta_i
∑i=1Nriβi的形式。注意,选取的同态基个数不能超过
9
9
9个,否则就不满足同态数的要求了!
这种做法的最大优势是取模方便。根据欧拉定理,同态基
β
i
\beta_i
βi在模
P
P
P意义下是循环的。这意味着当不同的同态基在模
P
P
P意义下相等,那么他们对最终答案的贡献也是相同的。
综上,我们记
M
i
M_i
Mi表示满足
β
m
o
d
  
P
=
i
\beta \mod P = i
βmodP=i的同态基
β
\beta
β的集合。由于这些同态基对答案的贡献等价,我们可以直接用组合公式来一并计算它们的贡献。
设
F
(
i
,
j
,
k
)
F(i,j,k)
F(i,j,k)表示在集合
M
0
∼
M
i
M_0\sim M_i
M0∼Mi中选取
j
j
j个同态基,模
P
P
P的值为
k
k
k的方案数。由于我们选取的同态基个数不超过
9
9
9个,并且每个同态基长度不相同,我们可以近似使用多重集的组合数公式来计算。
根据乘法原理和组合数公式,我们有:
F
(
i
,
j
,
k
)
=
∑
0
≤
q
≤
j
(
∣
M
i
∣
+
(
j
−
q
)
−
1
(
j
−
q
)
)
F
(
i
−
1
,
q
,
(
k
−
i
(
j
−
q
)
)
m
o
d
  
P
)
F(i,j,k)=\sum_{0\leq q \leq j}\dbinom{|M_i|+(j-q)-1}{(j-q)}F(i-1,q,(k-i(j-q))\mod P)
F(i,j,k)=0≤q≤j∑((j−q)∣Mi∣+(j−q)−1)F(i−1,q,(k−i(j−q))modP)
其中初态有:
F
(
0
,
j
,
0
)
=
(
∣
M
0
∣
+
j
−
1
j
)
F(0,j,0)=\dbinom{|M_0|+j-1}{j}
F(0,j,0)=(j∣M0∣+j−1)
在最终答案里至少要选取一个长度为
N
N
N的同态基
β
N
\beta_N
βN。我们可以先扣除这个决策,然后求出最优决策后将这个决策强行赋值给答案。具体来说,我们最多选取8个同态基使得有:
a
n
s
=
∑
0
≤
j
≤
8
F
(
P
−
1
,
j
,
(
P
−
β
N
)
m
o
d
  
P
)
ans=\sum_{0\leq j \leq 8}F(P - 1,j,(P-\beta_N)\mod P)
ans=0≤j≤8∑F(P−1,j,(P−βN)modP)