第 446 场周赛——求出数组的 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;
}
};

浙公网安备 33010602011771号