【欧拉计划】33. Digit cancelling fractions

(本题取 $n=9$)

【思路】题目描述得有些模糊,要求我们找到两个十位数 $a,b$($a \lt b$),使得 $a$ 的十位数和 $b$ 的个位数相等,同时使得 $\dfrac{a}{b}$ 与 $a,b$ 分别删去相同位数之后的商相等。

由于有两个数位相等,因此我们只需要枚举三个数位,这样就可以在 $\mathcal O(n^3)$ 枚举出所有的情况。约分需要用到 $\gcd$,因此最终时间复杂度为 $\mathcal O(n^3 \log n)$:

阅读更多

【欧拉计划】32. Pandigital products

(本题取 $n=9$)

【思路】我们可以 $\mathcal O(n!)$ 获得 $1 \sim 9$ 的排列,然后在排列组成的九位数中插两个空——其中一个位于两个乘数之间(相当于乘号),另一个位于左式和右式之间(相当于等号)。最后我们检查一下等式是否正确,正确就累加进入答案:

阅读更多

【欧拉计划】31. Coin sums

(本题取 $n=200$,$m=8$)

【思路】通过观察不难发现本题考察的是 DP。

如果我们用 $dp_{i,j}$ 表示使用 $j$ 种不同面额凑出 $i$ 分钱的方案个数,那么显然有初始状态:

$$dp_{0,1}=1$$

由于本题数据范围不大,我们可以暴力递推,从而覆盖所有情况。用 $val_i$ 表示第 $i$ 种货币的面额,则有:

$$dp_{i,j}=\sum_{i=1}^n \sum_{j=1}^m \sum_{k=1}^j dp_{i-val_j,k}$$

这样我们便得到了一个 $\mathcal O(nm^2)$ 的做法:

阅读更多

【欧拉计划】29. Distinct powers

(本题取 $n=100$)

【思路】考虑构造一个元素不可重的集合,通过 $\mathcal O(n^2)$ 的二维循环枚举所有乘方的结果,最后统计集合内元素个数:

阅读更多

【欧拉计划】28. Number spiral diagonals

(本题取 $n=1000$)

【思路】首先可以发现 $1$ 位于矩阵正中央,即 $(501,501)$ 处。

通过找规律可以发现,每走一步需要顺时针变换一次方向,但是如果已经走过或越界则需再次变换。这样,我们就可以遍历整个矩阵,从而在 $\mathcal O(n^2)$ 的效率下求出对角线的元素之和:

阅读更多

【欧拉计划】27. Quadratic primes

(本题取 $n=1000$)

【思路】由于范围不大,因而可以直接 $\mathcal O(n^2)$ 枚举,然后套上质数的判断即可。由于待判断的数大小不确定,因而用质数判断函数来代替欧拉筛:

阅读更多

【欧拉计划】26. Reciprocal cycles

【思路】这题的关键就是如何得到循环节。试想,当我们把一个单位分数扩大 $10$ 的若干次幂之后,得到的数的整数部分会出现循环。

因此,我们可以重复地将一个初始值为 $1$ 的数对单位分数的分母取模,然后乘上 $10$。

每操作一次,就检查这个数是否已经出现过。如果出现过,就说明已经找到循环节;否则标记并继续操作:

阅读更多