CSP202104-4 校门外的树 python 满分代码

这篇博客主要讨论了一种计算从特定障碍物到另一个障碍物之间可行方案数的方法。通过动态规划和筛法预存储数字因子,实现了从第u个障碍物到第i个障碍物的区间内所有可行长度的因子集合,并计算了该区间的方案总数。算法涉及到了数论、动态规划和数据结构的应用。
摘要由CSDN通过智能技术生成
# 计算从第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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值