第 446 场周赛——求出数组的 X 值 I

题目

求出数组的 X 值 I

题解

由于这题的k范围非常小,我们可以枚举k,子数组的话可以参考题目53. 最大子数组和,我们可以知道前面i - 1余数为y的子数组有多少个,然后就可以知道乘上当前v后的余数的子数组有多少个。最后f[n - 1][x]就是余数为x的子数组个数了,但是为了方便i = 0的情况,我们将i偏移变成了i + 1

参考代码

class Solution {
public:
    vector<long long> resultArray(vector<int>& nums, int k) {
        int n = nums.size();
        vector<long long> ans(k);
        vector f(n + 1, vector<int>(k));
        for(int i = 0; i < n; i++) {
            int v = nums[i] % k;
            f[i + 1][v] = 1;
            for(int y = 0; y < k; y++) {
                f[i + 1][y * v % k] += f[i][y];
            }
            for(int x = 0; x < k; x++) {
                ans[x] += f[i + 1][x];
            }
        }
        return ans;
    }
};
posted @ 2025-04-23 16:39  PZnwbh  阅读(7)  评论(0)    收藏  举报