【发布时间】:2016-11-21 11:52:54
【问题描述】:
给定一个数组,我想计算其乘积不能被 k 整除的子数组(连续)的数量。
例如。设 A = [1, 2, 3, 4, 5, 6] 和 K = 2
那么乘积不能被K整除的子数组的个数为2:
{1}
{3}
{5}
其余的都可以被 2 整除。
{1, 2}
{1, 2, 3}
{1, 2, 3, 4}
{1, 2, 3, 4, 5}
{1, 2, 3, 4, 5, 6}
{2}
{2, 3}
{2, 3, 4}
{2, 3, 4, 5} etc..
我尝试首先计算子数组的总数 (n)(n+1)/2,然后使用 mod 减去可被 k 整除的子数组的数量,但它不起作用。我该如何解决这个问题?
这会计算(错误地)乘积可被 K 整除的子数组的数量:
int curr = 1;
int x = 0;
for (int i = 0; i < a.length; i++) {
curr = curr * a[i] % k;
if (curr == 0) {
curr = 1;
if (x > 0)
ans = ans.subtract(NumberUtils.nChooseR(x + 1, 2));
if (a[i] % k != 0) {
x = 1;
} else {
x = 0;
}
} else {
x++;
}
}
if (x != 0) {
ans = ans.subtract(NumberUtils.nChooseR(x + 1, 2));
}
return ans;
一个稍微相关的问题是this one,但它涉及到加法,所以不能在这里应用。
编辑:数组大小限制为 10^5,数组元素限制为 10^9。因此,我正在寻找线性或线性时间的解决方案
【问题讨论】:
-
什么是子数组?它应该只包含一项吗?如果不是,为什么
{3, 5}不是解决方案? -
遇到
K = 4的解决办法是什么?{1}, {2}, {3, {5}或{1}, {3}, {5}, {6}? -
@DmitryBychenko by subarray 我的意思是连续的元素集
-
子数组的生产是什么?例如。
{1, 3} x {5, 7}是什么? -
@DmitryBychenko 我不确定你所说的生产是什么意思,但如果你问我如何将这些元素相乘,就像这样:如果数组是:[3,5,8] K 为 2,则其值为 3x5x8 = 120,可被 2 整除,这意味着这是一个有效的子数组。另一方面,如果 array = [1, 7, 11] 它的值是 77,它不能被 2 整除,所以它是一个无效的子数组