蓝桥杯序列计数-python题解

序列子集

问题描述

小明想知道,满足以下条件的正整数序列的数量:

  1. 第一项为 n;
  2. 第二项不超过 n;
  3. 从第三项开始,每一项小于前两项的差的绝对值。
      请计算,对于给定的 n,有多少种满足条件的序列。

输入格式

输入一行包含一个整数 n。

输出格式

输出一个整数,表示答案。答案可能很大,请输出答案除以10000的余数。

样例输入

4

样例输出

7

样例说明

以下是满足条件的序列:
4 1
4 1 1
4 1 2
4 2
4 2 1
4 3
4 4

评测用例规模与约定

对于 20% 的评测用例,1 <= n <= 5;
  对于 50% 的评测用例,1 <= n <= 10;
  对于 80% 的评测用例,1 <= n <= 100;
  对于所有评测用例,1 <= n <= 1000。

def next_item(res):
    res_ = []
    size = len(res)
    ab = abs(res[size - 1] - res[size - 2])
    if ab <= 1:
        return None
    for i in range(1, ab):
        new_res = []
        new_res += res
        new_res.append(i)
        res_.append(new_res)

    return res_


MOD = 10000

n = int(input())

res_list = []

temp_list = []

accept_list = []

for i in range(1, n + 1):
    res = [n, i]  # 两项时的情况
    res_list.append(res) # 把所有两项情况加入res_list记录

temp_list += res_list  # 把res_list记录进temp_list

while len(temp_list) > 0:
    for i in range(len(temp_list)):  # 判断temp_list的每一项
        next_ = next_item(temp_list[i])  # 判断这项可以再派生下一项
        # print(next_)
        if next_ is not None:  # 如果可以派生下一项,添加记录到accept_list
            accept_list += next_

    temp_list.clear()  # 清空

    if len(accept_list) != 0:
        # print(accept_list)
        # print(res_list)
        res_list = accept_list + res_list  # 把新派生出的项加到res_list,res_list此时已包含两项加新派生的项
        # print(res_list)
        temp_list += accept_list  # 新派生的项加到temp_list进行下次循环用
        accept_list.clear()

# print(res_list)  # 循环结束后,此时所有满足条件的项都在res_list中

print(len(res_list) % MOD)


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值