Project Euler 372
Project Euler 372
题目
Pencils of rays
Let \(R(M, N)\) be the number of lattice points \((x, y)\) which satisfy \(M<x\le N, M<y\le N\) and \(\left\lfloor \dfrac{y^2}{x^2} \right\rfloor\) is odd.
We can verify that \(R(0, 100) = 3019\) and \(R(100, 10000) = 29750422\).
Find \(R(2\cdot 10^6, 10^9)\).
Note : \(\lfloor x \rfloor\) represents the floor function.
解决方案
令\(L=M+1,\)那么 \(x,y\) 的范围等价于\(L\le x\le N, L\le y\le N.\)
对固定整数 \(k\ge 0\),条件\(\left\lfloor \dfrac{y^2}{x^2}\right\rfloor = k\Longleftrightarrow k\le \dfrac{y^2}{x^2} < k+1 \Longleftrightarrow \sqrt{k}x \le y < \sqrt{k+1}x.\)
由于 \(y\) 是整数,区间整数解个数为
\[ \#\{y\in\mathbb Z:\sqrt{k}x \le y < \sqrt{k+1}x\}=\max(0,\min(N,\lceil \sqrt{k+1}x\rceil-1)-\max(L,\lceil \sqrt{k}x\rceil)+1). \]
题目只要奇数层,因此
\[ R(M,N)=\sum_{\substack{k\ge 1\\k\equiv 1\pmod 2}}\sum_{x=L}^{N}\#\{y:\sqrt{k}x \le y < \sqrt{k+1}x,L\le y\le N\}. \]
对于给定 \(k\),要有解必须存在 \(y\le N\) 且 \(y\ge \sqrt{k}x\),即\(\displaystyle{\sqrt{k}x\le N\Longleftrightarrow x\le \left\lfloor \frac{N}{\sqrt{k}}\right\rfloor.}\) 记\(X_0=\left\lfloor \dfrac{N}{\sqrt{k}}\right\rfloor,X_1=\left\lfloor \dfrac{N}{\sqrt{k+1}}\right\rfloor.\) 因为 \(\sqrt{k+1}>\sqrt{k}\),所以 \(X_1\le X_0\)。
于是:
- 当 \(x\le X_1\) 时,\(\sqrt{k+1},x\le N\),上界不触顶;
- 当 \(X_1 < x \le X_0\) 时,\(\sqrt{k+1},x>N\),上界被 \(N\) 截断;
- 当 \(x> X_0\) 时,无解。
因此只需处理 \(x\in[L,X_0]\)。
对整数 \(x\),令\(A_k(x)=\left\lceil x\sqrt{k}\right\rceil,B_k(x)=\left\lceil x\sqrt{k+1}\right\rceil-1.\)
如果区间 \(L\le x\le X_1\),此时 \(B_k(x)\le N\),不需要截断,上层可取到 \(B_k(x)\),于是该 \(x\) 贡献为\((B_k(x)-A_k(x)+1)=\left(\lceil x\sqrt{k+1}\rceil-1\right)-\lceil x\sqrt{k}\rceil+1=\lceil x\sqrt{k+1}\rceil-\lceil x\sqrt{k}\rceil.\)
对于区间 \(X_1 < x\le X_0\),此时上界被 \(N\) 截断,贡献为\(N-\lceil x\sqrt{k}\rceil+1=(N+1)-\lceil x\sqrt{k}\rceil.\)
于是对固定奇数 \(k\),总贡献为\(\displaystyle{S_k=\sum_{x=L}^{X_1}(\lceil x\sqrt{k+1}\rceil-\lceil x\sqrt{k}\rceil\bigr)+\sum_{x=X_1+1}^{X_0}\bigl((N+1)-\lceil x\sqrt{k}\rceil).}\)整理得
\[ S_k =\sum_{x=L}^{X_1}\lceil x\sqrt{k+1}\rceil +(X_0-X_1)(N+1) -\sum_{x=L}^{X_0}\lceil x\sqrt{k}\rceil. \]
所以 \[ R(M,N)=\sum_{\substack{1\le k\le k_{\max} \\ k\equiv 1\pmod 2}} S_k. \]
接下来计算\(k\)能得到的最大取值\(k_{\max}\)。最大可能的比值发生在最小 \(x=L\)、最大 \(y=N\):\(\max\left\{\dfrac{y^2}{x^2}\right\}=\dfrac{N^2}{L^2}.\)因此\(k_{\max}=\left\lfloor \left(\dfrac{N}{L}\right)^2\right\rfloor\)
对非平方整数 \(d\),\(x\sqrt d\) 从不为整数,所以\(\lceil x\sqrt d\rceil=\lfloor x\sqrt d\rfloor+1.\)于是\(\displaystyle{\sum_{x=L}^{T}\lceil x\sqrt d\rceil=\sum_{x=L}^{T}\lfloor x\sqrt d\rfloor + (T-L+1).}\)
而当 \(d\) 为完全平方数 \(d=r^2\) 时,\(\displaystyle{\sum_{x=L}^{T}\lceil x\sqrt d\rceil=\sum_{x=L}^{T}rx=r\cdot \frac{(L+T)(T-L+1)}{2}.}\)所以问题归结为高效计算\(\displaystyle{F(d,T)=\sum_{x=1}^{T}\lfloor x\sqrt d\rfloor.}\)
我们接下来基于 Beatty / Euclid思想 计算 \(F(d,T)\)。
令\(\alpha=\dfrac{a+b\sqrt d}{c}, c>0,\)考虑\(\displaystyle{S(T,\alpha)=\sum_{x=1}^{T}\lfloor x\alpha\rfloor.}\)
如果 \(\alpha\ge 1\),设 \(q=\lfloor\alpha\rfloor\),\(\alpha'=\alpha-q\in[0,1)\),则 \(\lfloor x\alpha\rfloor=\lfloor x(\alpha'+q)\rfloor=\lfloor x\alpha'\rfloor+qx,\)因此
\[ S(T,\alpha)=S(T,\alpha')+q\cdot\frac{T(T+1)}{2}. \]
如果 \(0<\alpha<1\),设\(m=\lfloor T\alpha\rfloor,\)经典恒等式给出 \[ S(T,\alpha)=Tm-\sum_{y=1}^{m}\left\lfloor \frac{y}{\alpha}\right\rfloor. \]
而\(\dfrac1\alpha=\dfrac{c}{a+b\sqrt d}=\dfrac{c(a-b\sqrt d)}{a^2-b^2d},\)仍是同类型的二次无理数,因此可以继续递归。递归深度是 \(O(\log T)\) 量级。
最终,我们进行如下计算:
设 \(L=M+1\),计算\(k_{\max}=\left\lfloor\dfrac{N^2}{L^2}\right\rfloor.\)
对每个奇数 \(k=1,3,5,\dots,k_{\max}\):
- 计算\(X_0=\left\lfloor\dfrac{N}{\sqrt{k}}\right\rfloor,X_1=\left\lfloor\dfrac{N}{\sqrt{k+1}}\right\rfloor.\) 若 \(X_0<L\) 跳过。
- 计算两次前缀的 \(\sum\lceil x\sqrt d\rceil\)(\(d=k\) 与 \(d=k+1\)),代入\(\displaystyle{S_k=\sum_{x=L}^{X_1}\lceil x\sqrt{k+1}\rceil+(X_0-X_1)(N+1)-\sum_{x=L}^{X_0}\lceil x\sqrt{k}\rceil.}\)
累加所有 \(S_k\) 得 \(R(M,N)\)。
代码
1 | from tools import gcd, int_sqrt |