CCF-CSP 202209-1-如此编码 (Python) 前缀和 满分实现

202209-1-如此编码

问题

image-20230304211602709

image-20230304201139909

image-20230304212000853

image-20230304211651351

思路

  • 通过提示中的公式找出如下关系

\begin{array}{l} c_{1}=c_{0} a_{1} \ c_{2}=c_{1} a_{2} \ c_{3}=c_{2} a_{3} \ \ldots \ldots \ b_{1}=\frac{m % c_{1}}{c_{0}} \ b_{2}=\frac{m % c_{2}-c_{0} \times b_{1}}{c_{1}} \ b_{3}=\frac{m % c_{3}-c_{0} \times b_{1}-c_{1} \times b_{2}}{c_{2}}\ \ldots \ldots \ \end{array}

已知a数组,m

  • 用一个缓存变量存储-c_{0} \times b_{1}-c_{1} \times b_{2}-…

一个for循环即可求出数字b

实现

  • 我的版本-1(不好,用了两个同级for)
 n, m = map(int, input().split()) # n道题,编码结果为m
 a = [0] + [i for i in map(int , input().split())] # 选项个数列表,从1到n
 ​
 b = [0 for _ in range(n+1)] # 答案序号列表,从1到n
 c = [1] + [0 for _ in range(n)] # c列表,从0到n
 ​
 for i in range(1,n+1):
     c[i] = c[i-1] * a[i]
 ​
 b[1] = (m % c[1]) / c[0]
 temp = 0 # 存储分子负项和
 for i in range(2,n+1):
     temp = temp + c[i-2] * b[i-1]
     b[i] = (m % c[i] - temp) / c[i-1]
 ​
 print(*[i for i in map(int,b[1:])])
  • 我的版本-2
 n, m = map(int, input().split()) # n道题,编码结果为m
 a = [0] + [i for i in map(int , input().split())] # 选项个数列表,从1到n
 b = [0 for _ in range(n+1)] # 答案序号列表,从1到n
 ​
 c = 1 # 初始c0=1
 temp = 0 # 存储分子负项和
 for i in range(1,n+1):
     b[i] = (m % (c * a[i]) - temp) / c
     temp = temp + c * b[i]
     c = c * a[i]
 ​
 print(*[i for i in map(int,b[1:])])
 n, m = map(int, input().split()) # 输入n题目数量和m神秘数字
 a = list(map(int, input().split())) # 输入n道选择题的选项数字
 b = [] # 设置b数组来存放每道选择题的正确选项
 c = 1 # c为c0,初始值为1
 tc = 1 # tc为辅助值,即为t的下一个值
 temp = 0 # temp为辅助值,为记录除了此次的C*B之前所有C*B的值的和
 # 通过循环进行每道题答案的更新
 for i in a:
     # 将tc的值进行更新为此时c的下一个值
     tc = i*c
     # 向b数组中添加此时题目的正确选项
     b.append((m%tc-temp)//c)
     # 更新temp的值
     temp += c*b[-1]
     # 更新c的值
     c = tc
 # 输出每道题的正确选项
 print(*b)

python中 /// 的区别

  • /用于执行常规除法,返回一个浮点数结果,即使两个操作数都是整数
  • //用于执行整数除法,返回一个整数结果,即使其中一个或两个操作数是浮点数
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值