📌  相关文章
📜  创建一个总和为S的大小为N的数组,使得不存在总和为S或SK的子数组(1)

📅  最后修改于: 2023-12-03 14:50:14.815000             🧑  作者: Mango

题目介绍

给定一个大小为 $N$ 的数组,要求创建一个总和为 $S$ 的数组,使得该数组中不存在总和为 $S$ 或 $SK$(其中,$K$ 为任意正整数)的连续子数组。

解题思路

为了满足题目要求,需要注意以下几点:

  1. 不能存在子数组的和为 $S$
  2. 不能存在子数组的和为 $SK$

因此,可以通过构造出一个特定的数列,来满足上述要求。具体方法如下:

  1. 将 $N$ 个数按以下方式分别分为两组:

第一组:$S-1, SK-S+1, (S-1)(SK-S+1)$

第二组:1, $S-K, (S-K)S$

  1. 在以上两组中,分别选一个数相加,得到 $N$ 个数,组成一个新的数组 $a$

例如,当 $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