ARC 129 C Multiple of 7 题解

Description

给定整正数 n n n

构造一个长度不超过 1 0 6 10^6 106 的字符串,使得其中满足 ⌈ \lceil 从左到右依次拼接起来,得到的十进制数是 7 7 7 的倍数 ⌋ \rfloor 的区间 [ l , r ] [l,r] [l,r] 恰有 n n n 个。

n ≤ 1 0 6 n \le 10^6 n106

Solution

自闭了,构造题杀我!

首先,考虑对于一个固定的数字串 S S S,其中有多少合法的子串 [ l , r ] [l,r] [l,r]

考虑使用前缀和维护。令 a i a_i ai 表示, [ i , ∣ S ∣ ] [i,|S|] [i,S] 依次拼接起来得到的十进制数对 7 7 7 取模的值,则显然有 a i = ( a i + 1 + 1 0 ∣ S ∣ − i S i )  mod  7 a_i=(a_{i+1}+10^{|S|-i}S_i) \ \text{mod} \ 7 ai=(ai+1+10SiSi) mod 7。从而,把 [ l , r ] [l,r] [l,r] 从左到右依次拼接起来得到的十进制数字对 7 7 7 取模的值就是:

a l − a r + 1 1 0 ∣ S ∣ − r \frac {a_l-a_{r+1}} {10^{|S|-r}} 10Sralar+1

注意到 10 10 10 7 7 7 互质,因此 [ l , r ] [l,r] [l,r] 合法当且仅当 a l = a r + 1 a_l=a_{r+1} al=ar+1

更进一步的, S S S 中合法串的数量,就是 ∑ i = 0 6 c n t i ( c n t i − 1 ) 2 \sum_{i=0}^6 \frac {cnt_i(cnt_i-1)} {2} i=062cnti(cnti1),其中 c n t i cnt_i cnti 表示满足 a j = i a_j=i aj=i j j j 的数量。

可以发现,只要我们能将 n n n 拆分为 7 7 7三角形数 0 , 1 , 3 , 6 , ⋯ 0,1,3,6,\cdots 0,1,3,6,)的和,那么构造 a a a 就十分容易了,从而就唯一确定了 S S S。所以关键在于,如何将 n n n 进行拆分呢?

首先,根据费马多边形数定理,显然是能够进行拆分的。那么该如何构造呢?

考虑贪心——将 O ( n ) O(\sqrt n) O(n ) 个三角形数从大到小排列,从左往右扫描,令当前的三角形数为 v a l val val,若 v a l ≤ n val \le n valn 则从 n n n 中拆分出 v a l val val 并将 n n n 减去 v a l val val,否则不予拆分。我们惊人地发现——在 1 ≤ n ≤ 1 0 6 1 \le n \le 10^6 1n106 的时候,上述算法总是能够得到一组合法解(注意并不一定会拆分在三个及以内,但只要拆分在 7 7 7 个及以内就足够了)。

于是我们 O ( n ) O(n) O(n) 地解决了本题。

Code

咕咕咕

猜你喜欢

转载自blog.csdn.net/Cherrt/article/details/121480294
129