Project Euler 474
Project Euler 474
题目
Last digits of divisors
For a positive integer \(n\) and digits \(d\), we define \(F(n, d)\) as the number of the divisors of \(n\) whose last digits equal \(d\).
For example, \(F(84, 4) = 3\). Among the divisors of \(84 (1, 2, 3, 4, 6, 7, 12, 14, 21, 28, 42, 84)\), three of them \((4, 14, 84)\) have the last digit \(4\).
We can also verify that \(F(12!, 12) = 11\) and \(F(50!, 123) = 17888\).
Find \(F(10^6!, 65432)\) modulo \((10^{16} + 61)\).
解决方案
令\(N=10^6,d=65432,a=v_2(d),b=v_5(d),k=5\),即\(k\)是\(d\)的十进制位数。并记\(g=2^a5^b.\)
首先证明引理1:设 \(p\) 为素数,\(k\ge 1\),且 \(t=v_p(d)<k\)。若\(x\equiv d\pmod{p^k},\)则必有\(v_p(x)=t.\)
证明: 写 \(d=p^t u\),其中 \(p\nmid u\)。由 \(x\equiv d\pmod{p^k}\) 得 \(p^k\mid (x-d)\),特别地 \(p^{t+1}\mid(x-d)\),于是\(x=p^t u+p^{t+1}q=p^t(u+pq).\)
括号内对 \(p\) 不为 \(0\)(因为 \(u\not\equiv 0\pmod p\)),故 \(v_p(x)=t\)。证毕。
在本题中有\(a<k, b<k.\) 因此对任意满足 \(x\equiv d\pmod{10^k}\) 的 \(x\),由于同时有 \(x\equiv d\pmod{2^k}\) 与 \(x\equiv d\pmod{5^k}\),由上面的引理得到\(v_2(x)=a, v_5(x)=b.\)
这说明:所有符合末位条件的因子,都必须包含完全相同的 \(2\) 与 \(5\) 因子部分 \(g\)。
令\(M=\dfrac{10^k}{g}, D=\dfrac{d}{g}.\)把因子写成\(x=g\cdot u.\)
接下来证明引理2:在 \(a<k,b<k\) 的前提下,有
\[ x\equiv d\pmod{10^k} \Longleftrightarrow \begin{cases} x=g\cdot u,\\ u\equiv D\pmod M,\\ \gcd(u,10)=1. \end{cases} \]
证明:
- “\(\Rightarrow\)”:由引理1可知 \(v_2(x)=a,v_5(x)=b\),故 \(x\) 可写为 \(g\cdot u\) 且 \(v_2(u)=v_5(u)=0\),即 \(\gcd(u,10)=1\)。又 \(x\equiv d\pmod{10^k}\) 且 \(g\mid 10^k\)、\(g\mid d\),两边同除以 \(g\) 得 \(u\equiv D\pmod M\)。
- “\(\Leftarrow\)”:若 \(x=g u\) 且 \(u\equiv D\pmod M\),则 \(x\equiv gD=d\pmod{gM}=10^k\)。证毕。
因此我们只需统计:从 \(N!\) 中除去 \(2,5\) 的部分后,能组成多少个满足\(u\equiv D\pmod M, \gcd(u,M)=1\)的因子。
对每个素数 \(p\le N\),根据勒让德公式,令\(\displaystyle{e_p=v_p(N!)=\sum_{t\ge 1}\left\lfloor\frac{N}{p^t}\right\rfloor.}\) 那么任意因子可写成\(\displaystyle{x=\prod_{p\le N} p^{\alpha_p}, 0\le \alpha_p\le e_p.}\)
由引理2约化,\(u\) 只允许使用 \(p\ne 2,5\) 的素数:
\[ u=\prod_{\substack{p\le N\\p\ne 2,5}} p^{\alpha_p}, 0\le \alpha_p\le e_p, \]
并要求 \(u\bmod M\) 等于指定的单位余数 \(D\)。
记单位集合
\[ U=(\mathbb Z/M\mathbb Z)^\times={r\in{1,\dots,M-1}:\gcd(r,M)=1}. \]
由 \(\gcd(u,M)=1\) 可知最终余数一定落在 \(U\),因此状态只需开在 \(U\) 上。
设当前从小到大已经处理完的素数集合为 \(\mathcal P\),定义状态
\[ f_{\mathcal P}(r) =\#\left\{(\alpha_p)_{p\in\mathcal P}:\ 0\le \alpha_p\le e_p,\ \prod_{p\in\mathcal P}p^{\alpha_p}\equiv r\pmod M\right\},r\in U. \]
表示处理完\(\mathcal P\)后,各个不同模数\(r\)下因子的个数。
那么,初始条件为
\[ f_{\varnothing}(r)= \left\{\begin{aligned} &1 && \text{if}\quad r\equiv 1\pmod M,\\ &0 && \text{if}\quad r\not\equiv 1\pmod M, \end{aligned}\right. \quad (r\in U). \]
则对任意 \(r\in U\) 有:
\[ f_{\mathcal{P}\cup \{p\}}(r)= \displaystyle\sum_{t=0}^{e_p} f_{\mathcal P}(r\cdot p^{-t})\ \]
其中 \(p^{-t}\) 表示模 \(M\) 下的逆元幂;由于 \(\gcd(p,M)=1\),逆元总是存在的。不过,难点在于 \(e_p\) 很大,不能直接做 \(O(|U|\cdot e_p)\) 的卷积。
由此,我们定义置换\(T_p(r)\equiv r\cdot p\pmod M (r\in U),\)并取它的某个循环\(\mathcal C=(c_0,c_1,\dots,c_{m-1}), c_{j+1}\equiv T_p(c_j)\equiv c_j\cdot p\pmod M,\)下标按模 \(m\) 计算(即 \(c_{j+m}=c_j\))。
将 \(f_{\mathcal P}\) 限制到该循环上,记\(g(j)=f_{\mathcal P}(c_j), g'(j)=f_{\mathcal P'}(c_j).\)由 \(c_j\cdot p^{-t}=c_{j-t}\),转移在循环上化为\(\displaystyle{g'(j)=\sum_{t=0}^{C-1} g(j-t).}\)
于是,我们先定义窗口和 \(w(j)\),再写 \(g'(j)\)。令\(C=qm+r, 0\le r<m,\)并定义\(\displaystyle{S=\sum_{i=0}^{m-1} g(i).}\)
定义长度为 \(r\) 的窗口和函数\(\displaystyle{w(j)=\sum_{i=0}^{r-1} g(j-i).}\)那么 \(w(j)\) 可用以下分段递推计算:
\[ w(j)= \left\{\begin{aligned} &\sum_{i=0}^{r-1} g(-i) && \text{if}\quad j=0,\\ &w(j-1)+g(j)-g(j-r) && \text{if}\quad 1\le j\le m-1. \end{aligned}\right. \]
说明:\(g(-i)\)、\(g(j-r)\) 的下标都按模 \(m\) 解释,例如 \(g(-i)=g(m-i)\)。
因为长度为 \(C\) 的环形窗口包含 \(q\) 次整圈加 \(r\) 个额外项,所以\(g'(j)= qS+w(j).\)
最终,对循环 \(\mathcal C\) 上的每个 \(j\),最后回代为\(f_{\mathcal{P}\cup\{p\}}(c_j)=g'(j).\)
对所有循环做同样计算,即完成一次素数 \(p\) 的整体更新。
代码
1 |
|