专栏文章
题解:P14199 [ICPC 2024 Hangzhou R] Make It Divisible
P14199题解参与者 1已保存评论 0
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @minmtntk
- 此快照首次捕获于
- 2025/12/02 04:59 3 个月前
- 此快照最后确认于
- 2025/12/02 04:59 3 个月前
题目分析
给定长度为的序列和整数,我们需要找到所有满足的,使得序列成为可除序列。可除序列的定义是:对于任意子区间,存在一个能整除该区间内所有元素。
解题思路
- 可除序列性质:整个序列必须满足最小值能整除所有元素。因此我们需要保证能整除所有。
- 数学推导:设,则必须满足对所有成立。这等价于,其中是原序列的最小值。
- 候选计算:有效的必须满足,其中是序列中所有的最大公约数。
算法步骤
- 计算序列的最小值和所有的GCD。
- 若(即所有相等),则所有都满足条件。
- 否则,计算满足且的的个数和总和。
代码实现
PYTHONimport sys
import math
def solve():
input = sys.stdin.read().split()
ptr = 0
T = int(input[ptr])
ptr += 1
for _ in range(T):
n, k = map(int, input[ptr:ptr+2])
ptr +=2
b = list(map(int, input[ptr:ptr+n]))
ptr +=n
b_min = min(b)
diffs = [num - b_min for num in b]
g = 0
for d in diffs:
g = math.gcd(g, d)
if g ==0:
cnt = k
total = k*(k+1)//2
else:
x0 = (-b_min) % g
if x0 ==0:
x0 = g
max_x = (k - x0) // g * g + x0
if max_x <1:
cnt =0
total=0
else:
cnt = (max_x -x0) // g +1
total = cnt * x0 + g * cnt * (cnt -1) //2
print(cnt, total)
solve()
这是一篇Python题解,C++请自己尝试:)
相关推荐
评论
共 0 条评论,欢迎与作者交流。
正在加载评论...