---
# System prepended metadata

title: 3512. Minimum Operations to Make Array Sum Divisible by k
tags: ["easy\_"]

---


# 3512. Minimum Operations to Make Array Sum Divisible by k

## 題目簡述

給定一個整數陣列 `nums` 和一個整數 `k`，
每次操作可以選擇某個 `nums[i]`，並將它 **減少 1**。
問最少需要多少次操作，使得陣列總和能被 `k` 整除。

---

## 思路解析

1. 設陣列總和為 `sum`。
2. 目標是讓 `sum % k == 0`。
3. 允許的操作是「減 1」，等價於「把總和調整到最接近的 k 的倍數」。
4. 所以答案就是 `sum % k`：

   * 餘數 = 還需要減掉的次數。
   * 如果 `sum` 已經可以整除 `k`，那餘數是 0，不需要操作。

> 如果題目允許 `nums[i]` 為負數，則要加上 `if (r < 0) r += k;` 來保證餘數是非負的。

---

## 程式碼實作

```cpp
class Solution {
public:
    int minOperations(vector<int>& nums, int k) {
        int sum = 0;
        for (int x : nums) sum += x;   // 計算總和
        int r = sum % k;              // 取餘數
        // if (r < 0) r += k;          // 若含負數，確保非負餘數
        return r;
    }
};
```

---

## 複雜度分析

* **時間複雜度**：O(n)，遍歷陣列一次計算總和。
* **空間複雜度**：O(1)，只需要常數額外空間。

---

## 補充

* 若擔心總和溢位，可以改用 `long long` 或 `accumulate(nums.begin(), nums.end(), 0LL)`。

