设有一阶梯每步跨2阶最后余1阶;每步跨3阶最后余2阶;每步跨5阶最后余4阶;每步跨6阶最后余5阶;只有每步跨7阶时正好到阶梯顶。任意输入一个整数N请问在整数N内有多少种可能能够组成爱因斯坦的阶梯请你找到他们并依次输出。
根据题意,我们可以列出如下的方程组:
$$ \begin{cases} x\equiv1\pmod2\ x\equiv2\pmod3\ x\equiv4\pmod5\ x\equiv5\pmod6\ x\equiv0\pmod7 \end{cases} $$
其中 $x$ 表示阶梯的总台阶数。我们可以使用中国剩余定理来求解这个方程组。
首先,由于 $7$ 是一个质数,所以对于最后一个方程,我们可以直接使用逆元来求解:
$$ x\equiv0\pmod7\Rightarrow x=7k $$
$$ \begin{aligned} &5\times3\equiv1\pmod7\ &5\times2\equiv4\pmod7\ &2\times3\equiv1\pmod5\ &2\times5\equiv1\pmod3\ \end{aligned} $$
因此,我们可以将前四个方程组合并,得到:
$$ x=30a+22 $$
其中 $a$ 为任意整数。
最后,我们将 $x=7k$ 和 $x=30a+22$ 代入 $x\leq N$,得到所有满足条件的阶梯。具体做法是,先找到最小的 $k$,使得 $7k>N$,然后在 $0\leq a < \frac{N-22}{30}$ 的范围内枚举 $a$,计算出所有满足条件的 $x$。
以下是 Python 代码实现:
def CRT(a, b, c, d, e):
M1, M2, M3, M4 = 3 * 5 * 7, 2 * 5 * 7, 2 * 3 * 7, 2 * 3 * 5
r1, r2, r3, r4 = 1, 1, 1, 1
while True:
if (r1 * M1) % 2 == a and (r1 * M1) % 3 == b and (r1 * M1) % 5 == c and (r1 * M1) % 7 == 0:
return r1 * M1 + e
if (r2 * M2) % 3 == b and (r2 * M2) % 5 == c and (r2 * M2) % 7 == 0:
return r2 * M2 + e
if (r3 * M3) % 5 == c and (r3 * M3) % 7 == 0:
return r3 * M3 + e
if (r4 * M4) % 7 == 0:
return r4 * M4 + e
r1 += 1
r2 += 1
r3 += 1
r4 += 1
n = int(input())
ans = []
for k in range(1, n // 7 + 2):
x = 7 * k
for a in range((n - 22) // 30 + 1):
x = CRT(x % 2, x % 3, x % 5, x % 6, 5)
if x > n:
break
if x not in ans:
ans.append(x)
print(len(ans))
print(*ans)
时间复杂度为 $O(\frac{N}{210}\log N)$。
原文地址: https://www.cveoy.top/t/topic/bib3 著作权归作者所有。请勿转载和采集!