# 计算从第u个障碍物到第i个障碍物作为整体的区间上可行的方案数
def func(u, i):
# 每一次大循环里首先输入的情况是u=i-1
# 这里对这种情况下的可行因数集合s进行初始化
global s
# 长度本身是一个不合法因子,提前加入,长度增量-1
s.add(idx[i]-idx[u])
pre = len(s)
s2 = divisor[idx[i]-idx[u]] # 当前整体区间可行因子
s.update(s2)
return len(s)-pre
MOD = 10**9+7
n = int(input()) # 障碍物的个数
idx = list(map(int, input().split())) # 储存了所有障碍物的坐标
# 筛法预存储所有数字的因子
divisor = [[1] for i in range(idx[-1]+1)] # 储存了每个index对应的因数
# 对于所有可能的因子遍历
for i in range(2, idx[-1]//2+1):
# 以因子为步长,加入因子
for u in range(i, idx[-1]+1, i):
divisor[u].append(i)
# dp[i]为到第i个障碍物为止,有多少种方案
# (这里i从0开始,即存在第0个障碍物,与idx数组下标对应,障碍物下标从0到n-1)
# dp[0]初始化为1
dp = [1]+[0]*(n-1)
c = 0
s=set()
for i in range(1, n):
c = +1
# 初始化一个集合,集合中为从障碍物u到障碍物i作为整体的区间上可行的因数
s.clear()
for u in range(i-1, -1, -1):
dp[i] += (dp[u]*func(u, i)) % MOD
print(dp[-1] % MOD)
CSP202104-4 校门外的树 python 满分代码
最新推荐文章于 2024-03-11 16:14:14 发布
这篇博客主要讨论了一种计算从特定障碍物到另一个障碍物之间可行方案数的方法。通过动态规划和筛法预存储数字因子,实现了从第u个障碍物到第i个障碍物的区间内所有可行长度的因子集合,并计算了该区间的方案总数。算法涉及到了数论、动态规划和数据结构的应用。
摘要由CSDN通过智能技术生成