📅  最后修改于: 2023-12-03 14:50:14.815000             🧑  作者: Mango
给定一个大小为 $N$ 的数组,要求创建一个总和为 $S$ 的数组,使得该数组中不存在总和为 $S$ 或 $SK$(其中,$K$ 为任意正整数)的连续子数组。
为了满足题目要求,需要注意以下几点:
因此,可以通过构造出一个特定的数列,来满足上述要求。具体方法如下:
第一组:$S-1, SK-S+1, (S-1)(SK-S+1)$
第二组:1, $S-K, (S-K)S$
例如,当 $N=3, S=5, K=2$ 时,构造出的数组 $a$ 为:
$$a=[4, 3, 20]$$
接下来,需要证明该数组满足上述要求。
首先,证明不存在子数组之和为 $S$。
对于一个长度大于等于 $2$ 的子数组 $[a_i, a_{i+1}, ..., a_j]$,其和为 $sum=a_i+a_{i+1}+...+a_j$。
因为 $a_i$ 和 $a_{i+1}$ 分别来自两组数列中的不同数,它们之间的差值为 $SK$。
又因为 $S$ 不能被 $K$ 整除,因此 $S \mod K$ 不等于 $0$。所以,无论 $a_i$ 和 $a_{i+1}$ 中哪个数来自第一组,哪个数来自第二组,它们之间都不能组成和为 $S$ 的连续子数组。
对于长度等于 $1$ 的子数组 $[a_i]$,由于 $a_i$ 不等于 $S$,因此不存在子数组之和为 $S$。
因此,不存在子数组之和为 $S$。
接下来,证明不存在子数组之和为 $SK$。
对于一个长度大于等于 $2$ 的子数组 $[a_i, a_{i+1}, ..., a_j]$,其和为 $sum=a_i+a_{i+1}+...+a_j$。
因为 $a_i$ 和 $a_{i+1}$ 分别来自两组数列中的不同数,它们之间的差值为 $SK$。
当 $a_i$ 和 $a_{i+1}$ 来自同一组时,它们之间的差值为 $S$ 或 $S-K$,均不能组成和为 $SK$ 的连续子数组。
当 $a_i$ 和 $a_{i+1}$ 来自不同的组时,它们之间的差值为 $(S-1)(SK-S+1)$,由于 $SK-S+1$ 不能被 $S-1$ 整除,因此间隔的位置无法组成和为 $SK$ 的连续子数组。
对于长度等于 $1$ 的子数组 $[a_i]$,由于 $a_i$ 不等于 $SK$,因此不存在子数组之和为 $SK$。
因此,不存在子数组之和为 $SK$。
def create_array(n: int, s: int, k: int) -> List[int]:
a = [s-1, s*k-s+1, (s-1)*(s*k-s+1), 1, s-k, (s-k)*s]
res = []
for i in range(n):
res.append(a[i%6])
return res