存在长度为m的数组,其中所有条目都是正(> = 0)整数。我希望条目的总和为0 mod n。
我想要一个所有这些数组的列表,其中条目的平方和小于k。
我该怎么做?我想不出找到所有这些数组的方法,只是其中的一些。
我可以展示我在python中编写的内容,但我的方法存在缺陷,我需要从头开始,所以除非有要求,否则我不会显示它。
答案 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)
有三个可以帮助您的观察结果如下:
对数组的约束与数组元素的顺序无关。因此,假设为a_0 <= a_1 <= ... <= a_m-1
。
当且仅当[a_0,...,a_m-1]
时,非负整数的数组0 mod n
总和为-a_m-1 = a0 + ... + a_m-2 mod n
。因此,第一个m-1
条目是免费的,但最终条目是固定的。
条件a_0^2 + ... + a_m-1^2 < k
限制了条目的大小。因此循环是有限的。
解决方案可能是这样的:
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;
}
}