DDDDD 问题
给一个正整数 N N N 和 一个正个位数 D D D ,求至少多少个 D D D 组成的 D D … D D ‾ \overline{DD\dots DD} D D … D D 可以被 N N N 整除。
1 ≤ N ≤ 2 × 1 0 9 1\le N\le 2\times 10^9 1 ≤ N ≤ 2 × 1 0 9 。
显然 D D … D D ‾ \overline{DD\dots DD} D D … D D 可以表示为 D × ( 1 0 k − 1 ) 9 \frac{D\times(10^k-1)}{9} 9 D × ( 1 0 k − 1 ) ,推一波式子:
N ∣ D × ( 1 0 k − 1 ) 9 9 N ∣ D × ( 1 0 k − 1 ) 设 d = gcd ( D , 9 N ) : 9 N d ∣ 1 0 k − 1 1 0 k ≡ 1 ( m o d 9 N d ) N\mid\frac{D\times(10^k-1)}{9}\\
9N\mid D\times (10^k-1)\\
设\,d=\gcd(D,9N):\\
\frac{9N}{d}\mid10^k-1\\
10^k\equiv1\pmod{\frac{9N}{d}}
N ∣ 9 D × ( 1 0 k − 1 ) 9 N ∣ D × ( 1 0 k − 1 ) 设 d = g cd( D , 9 N ) : d 9 N ∣ 1 0 k − 1 1 0 k ≡ 1 ( m o d d 9 N )
此时,若 10 10 1 0 和 9 N d \frac{9N}{d} d 9 N 不互质那么无解。
考虑如何求出 k k k 的最小值,即答案,根据欧拉定理,有:
1 0 φ ( 9 N d ) ≡ 1 ( m o d 9 N d ) 10^{\varphi(\frac{9N}{d})}\equiv 1\pmod{\frac{9N}{d}}
1 0 φ ( d 9 N ) ≡ 1 ( m o d d 9 N )
此时最小的 k k k 一定是 φ ( 9 N d ) \varphi(\frac{9N}{d}) φ ( d 9 N ) 的因子.
证明
设 φ ( 9 N d ) = M \varphi(\frac{9N}{d})=M φ ( d 9 N ) = M ,假如最小的 k = x k=x k = x 且 x ∤ M x\nmid M x ∤ M ,那么设 M = q x + r M=qx+r M = q x + r ;
因为 1 0 x ≡ 1 ( m o d 9 N d ) 10^x\equiv 1\pmod{\frac{9N}{d}} 1 0 x ≡ 1 ( m o d d 9 N ) ,所以 1 0 q x ≡ 1 ( m o d 9 N d ) 10^{qx}\equiv 1\pmod{\frac{9N}{d}} 1 0 q x ≡ 1 ( m o d d 9 N ) ;
由于 1 0 M ≡ 1 ( m o d 9 N d ) 10^M\equiv 1\pmod{\frac{9N}{d}} 1 0 M ≡ 1 ( m o d d 9 N ) 所以 1 0 q x + r ≡ 1 ( m o d 9 N d ) 10^{qx+r}\equiv1\pmod{\frac{9N}{d}} 1 0 q x + r ≡ 1 ( m o d d 9 N ) ,1 0 r ≡ 1 ( m o d 9 N d ) 10^r\equiv 1\pmod{\frac{9N}{d}} 1 0 r ≡ 1 ( m o d d 9 N ) ;
由于 0 ≤ r < x 0\le r<x 0 ≤ r < x ,所以 r r r 比 x x x 更小,矛盾。
那么枚举 φ ( 9 N d ) \varphi(\frac{9N}{d}) φ ( d 9 N ) 的因子,快速幂判断即可。
树的带权拓扑序问题
给定一棵有根树,每个点有个权值 a i a_i a i ,对于该树的所有拓扑序 p p p ,求 ∑ a i p i \sum a_ip_i ∑ a i p i 的最大值。
设 a a a 的最小值为 a u a_u a u ,那么不难发现一定有 p u = p f a u + 1 p_u=p_{fa_u}+1 p u = p f a u + 1 。
那么不妨把 u u u 和 f a u fa_u f a u 缩起来,给答案增加 a u a_u a u 。
对于两个连通块 x , y x,y x , y ,设其点数和 a i a_i a i 总和为 ( s i z x , s m x ) (siz_x,sm_x) ( s i z x , s m x ) 和 ( s i z y , s m y ) (siz_y,sm_y) ( s i z y , s m y ) ,那么 x x x 在 y y y 前贡献为 s i z x × s m y siz_x\times sm_y s i z x × s m y ,y y y 在 x x x 前贡献为 s i z y × s m x siz_y\times sm_x s i z y × s m x ,所以 x x x 排在 y y y 前当且仅当 s i z x × s m y ≥ s i z y × s m x siz_x\times sm_y\ge siz_y\times sm_x s i z x × s m y ≥ s i z y × s m x 即 s m x s i z x ≥ s m y s i z y \frac{sm_x}{siz_x}\ge\frac{sm_y}{siz_y} s i z x s m x ≥ s i z y s m y 。
那么把连通块权值当成 s m s i z \frac{sm}{siz} s i z s m 看作正常点即可。
合并 u u u 的连通块 ( s i z u , s m u ) (siz_u,sm_u) ( s i z u , s m u ) 和 f a u fa_u f a u 的连通块 ( s i z f a u , s m f a u ) (siz_{fa_u},sm_{fa_u}) ( s i z f a u , s m f a u ) 会给答案增加 s i z f a u × s m u siz_{fa_u}\times sm_u s i z f a u × s m u ,边合并边计算即可。
使用堆维护,时间复杂度 O ( n log n ) O(n\log n) O ( n log n ) 。
区间虚树大小问题
给定一棵有点权的有根树和一个节点序列 a a a ,q q q 次询问,每次求 a [ l , r ] a_{[l,r]} a [ l , r ] 到根的路径覆盖到的所有点的点权和。
可以离线。
可以回滚莫队维护,O ( n n ) O(n\sqrt n) O ( n n ) 。
也可以先树剖再启发式合并维护每个点子树中点在 a a a 中出现位置的集合,先把 u u u 的贡献算进其重儿子,启发式合并维护轻儿子的贡献。
具体的,令 u u u 的子树大小为子树中每个点在 a a a 中出现的次数之和,按照这个定义进行重链剖分。
剖分完令 w u w_u w u 为 u u u 到其所在重链链顶的点权和,s t u st_u s t u 为 u u u 子树中每个点在 a a a 中出现位置的集合,则 s t u st_u s t u 直接从 s t h e v u st_{hev_u} s t h e v u 继承(h e v u hev_u h e v u 为 u u u 的重儿子),然后把 u u u 在 a a a 中的出现位置插入到 s t u st_u s t u ,再遍历 u u u 的轻儿子 v v v ,把 x ∈ s t v x\in st_v x ∈ s t v 插入到 s t u st_u s t u 。
每次插入 x x x 找到其前驱后继 l b , r b lb,rb l b , r b ,给 l ∈ [ l b , x ] , r ∈ [ x , r b ] l\in [lb,x],r\in [x,rb] l ∈ [ l b , x ] , r ∈ [ x , r b ] 的所有区间 [ l , r ] [l,r] [ l , r ] 增加 w u w_u w u 的贡献,这个可以离线再用扫描线维护。
这样由于轻儿子 s t v st_v s t v 的大小总是不超过 s t u st_u s t u 的大小,所以时间复杂度是启发式合并的复杂度,总复杂度 O ( n log 2 n ) O(n\log ^2n) O ( n log 2 n ) 。
参考:【2024NOI模拟赛11】项链 做题记录