【欧拉计划】37. Truncatable primes

(本题取 $n=1000000$)

【思路】$\mathcal O(n)$ 欧拉筛,然后枚举所有在范围内质数并检查是否符合题意。程序的时间复杂度为 $\mathcal O(n \log_{10} n)$:

阅读更多

【欧拉计划】36. Double-base palindromes

(本题取 $n=1000000$)

【思路】我们可以 $\mathcal O(n)$ 枚举所有在范围的整数,然后每次 $\mathcal O(\log n)$ 进行数位的处理和检查。总体时间复杂度为 $\mathcal O(n \log n)$:

阅读更多

【欧拉计划】34. Digit factorials

(本题取 $n=9$)

【思路】我们可以储存 $0 \sim 9$ 的所有阶乘的值,然后在 $[10,9!]$ 内枚举所有的数并检验即可。枚举的时间复杂度为 $\mathcal O(n!)$:

阅读更多

【欧拉计划】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)$ 的效率下求出对角线的元素之和:

阅读更多