代码拍卖会 草稿

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, N1018,P500,答案对 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)=jp9F(i1,p,(k10ij)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(N1)。任意一个同态数,似乎都可以拆分成若干个长度不同的 11111....111 11111....111 11111....111相加!根据这两个性质,我们定义一个概念:同态基
定义同态基 β i = 1 0 i − 1 9 \beta_i=\frac{10^i-1}{9} βi=910i1表示由连续的 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 M0Mi中选取 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)=0qj((jq)Mi+(jq)1)F(i1,q,(ki(jq))modP)
其中初态有:
F ( 0 , j , 0 ) = ( ∣ M 0 ∣ + j − 1 j ) F(0,j,0)=\dbinom{|M_0|+j-1}{j} F(0,j,0)=(jM0+j1)
在最终答案里至少要选取一个长度为 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=0j8F(P1,j,(PβN)modP)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值