找到总和为0 mod n的数组

时间:2013-03-04 18:18:28

标签: algorithm

存在长度为m的数组,其中所有条目都是正(> = 0)整数。我希望条目的总和为0 mod n。

我想要一个所有这些数组的列表,其中条目的平方和小于k。

我该怎么做?我想不出找到所有这些数组的方法,只是其中的一些。

我可以展示我在python中编写的内容,但我的方法存在缺陷,我需要从头开始,所以除非有要求,否则我不会显示它。

2 个答案:

答案 0 :(得分:2)

我现在只能想到一个非常强力的解决方案。让我举一个实数的例子。设m = 4,n = 5,k = 25.因此,您将拥有的是迭代所有数组,并且对于每个位置,测试从1到给定范围的所有数字 u 。 为了计算这个 u ,我想到了这一点。在这种最糟糕的情况下,你会有类似的东西:

[1 1 1 u]

这意味着3 + u ** 2必须小于k。因此,我使用 u 作为int(sqrt(k - (m-1)))。

from math import sqrt

array = [1, 2, 3, 4]
comb = [0 for i in range(m)]
u = int(sqrt(k-m+1))

all_combs(comb, 0, 0, 0)

def all_combs(comb, pos, sum, square_sum):
    global n, m, u, k

    if (square_sum > k):
        # Invalid case
        return
    if (pos == m):
        if (sum % n == 0):
            print comb
        return

    for i in range(1,u+1):
        comb[pos] = i
        all_combs(comb, pos + 1, sum + i, sum_square + i**2)

是否清楚?

答案 1 :(得分:0)

有三个可以帮助您的观察结果如下:

  1. 对数组的约束与数组元素的顺序无关。因此,假设为a_0 <= a_1 <= ... <= a_m-1

  2. 当且仅当[a_0,...,a_m-1]时,非负整数的数组0 mod n总和为-a_m-1 = a0 + ... + a_m-2 mod n。因此,第一个m-1条目是免费的,但最终条目是固定的。

  3. 条件a_0^2 + ... + a_m-1^2 < k限制了条目的大小。因此循环是有限的。

  4. 解决方案可能是这样的:

    array := [0,...,0];
    sqsum := sum_{j=0..m-1} array[j]^2;
    for i := m-2...1 do {
      array[i]++;
      for j from i+1 to m-2 do
        array[j] := array[i];
      L := sum_{j=0..m-2} array[j] mod n;
      array[m-1] := n-L;
      sqsum := sum_{j=0..m-1} array[j]^2;
      while sqsum < k do {
        print(array);
        sqsum := sqsum + 2*array[m-1]n+n^2;
        array[m-1] := array[m-1]+n;
      }
    }