2019牛客暑期多校训练营(第三场) - D - Big Integer - 数论

https://ac.nowcoder.com/acm/contest/883/D

\(A(n)\) 是由n个1组成的一个整数。

第一步:把 \(A(n)\) 表示为 \(\frac{10^n-1}{9}\) (第一步都想不出来)

思路1:

那么 \(A(n)=0\;mod\;p\) ,当9和p互质的时候,存在一个 \(inv9\) ,那么原式即 \((10^n-1)*inv9=0\;mod\;p\)

两边乘9,移项得 \(10^n=1\;mod\;p\)

由欧拉定理,得 \(10^n=10^{n\;mod\;p-1}\;mod\;p\)

即这样的n必定是循环的,取 \(p-1\) 以内的一个研究

由费马小定理 \(a^{p-1} = 1\;mod\;p\) ,这样的n存在,且 \(n=p-1\)

这样,随着n增加,模p的余数必定是循环的,循环节的长度至多为 \(p-1\) ,那会不会有更短的呢?

考虑 \(d|p-1\) ,那么可以变形为 \(10^{p-1}=10^{d\frac{p-1}{d}}\;mod\;p\)\((10^\frac{p-1}{d})^{d}=1\;mod\;p\)

这样最小的循环节必定是 \(p-1\) 的因数(赛中有发现),\(O(\sqrt {p})\) 枚举d,\(O(logd)\) 验证其是否是循环节(直接快速幂看看是不是和 \(10^0=1\;mod\;p\)一样就可以了)

目前复杂度\(O(\sqrt {p} logp)\)

找到最小的循环节之后,考虑怎么计数。那当然是要求 \(d|n\) 的个数,这样的(正整数)n明显在m以内有 \(\lfloor\frac{m}{d}\rfloor\)个。

但是套上 \(n=i^j\) 之后呢?猜测和d的质因数分解有关(赛中有发现)。

考虑i的质因数分解 \(i=p_1^{a_1}p_2^{a_2}p_3^{a_3}...p_k^{a_k}\)

\(i^j=p_1^{ja_1}p_2^{ja_2}p_3^{ja_3}...p_k^{ja_k}\)

分解d \(d=p_1^{b_1}p_2^{b_2}p_3^{b_3}...p_k^{b_k}\)

整除的条件,d是n的因子,则n的各个质因子覆盖d,即 \(ja_x>=b_x\) 对所有的 \(1<=x<=k\) 成立。

最值得学习的技巧来啦:考虑固定住j,那么合法的i满足什么条件才能满足上式呢?是d的每种质因子\(p_x\),i都至少要有\({\lceil\frac{b_x}{j}\rceil\)

猜你喜欢

转载自www.cnblogs.com/Yinku/p/11249564.html