题目描述
给你一个正整数数组 nums 和一个正整数 k。
你可以对数组执行一次操作:移除不重叠的前缀和后缀(可以为空),留下一个连续非空子数组。
对于每一种留下的子数组,计算:
(该子数组的乘积) % k = x
你需要统计所有可能的结果 x ∈ [0, k-1] 出现的次数,返回一个长度为 k 的数组 result,其中:
result[x] 表示得到 x 作为余数的方案数
解题思路
你可以移除任意前缀和后缀 ,留下的是一个非空的连续子数组。
也就是说:我们其实是统计所有子数组的乘积模 k 的结果分布 。
直接采用动态规划进行转移
java
class Solution {
public long[] resultArray(int[] nums, int k) {
long[] ans = new long[k];
long[] lurminexod = new long[k];
for (int i : nums) {
long[] newlurminexod = new long[k];
for (int j = 0; j < k; j++) {
int index = (int)(((long)j * i) % k);
newlurminexod[index] += lurminexod[j];
}
newlurminexod[i % k]++;
lurminexod = newlurminexod;
for (int j = 0; j < k; j++) {
ans[j] += lurminexod[j];
}
}
return ans;
}
}