假设我有一个10位数的 multiset ,例如S = { 1, 1, 2, 2, 2, 3, 3, 3, 8, 9 }
。有没有除暴力之外的任何方法来查找S
元素的不同排列的数量,这样当排列被视为十位整数时,它可被特定数字n
整除? n
将在1
到10000
范围内。
例如:
如果S = { 1, 2, 3, 4, 6, 1, 2, 3, 4, 6 }
和n = 10
,则结果为0
(因为这10个数字的排列不会给出可被10整除的数字)
如果S = { 1, 1, 3, 3, 5, 5, 7, 7, 9, 2}
和n = 2
,则结果为9! / 2^4
(因为我们最后必须有2
,所以有9!
种方式来置换其他元素,但有四对相同的元素)
答案 0 :(得分:1)
您可以像这样修剪搜索:找到NUM的素数因子分解。显然可以被NUM整除,排列需要被NUM的所有素因子整除。因此,您可以使用 simple divisibility rules 来避免产生许多无效的候选人。
答案 1 :(得分:1)
我有一些想法,但它没有组织成一个实际的算法。
对于N = 2,我们只看到我们可以在排列结束时放多少个偶数并计算出那个数字。
对于N = 3,我们知道数字的总和必须可以被3整除。这意味着我们可以在我们的排列中自由地输入任何3s,6s,9s和0s,但是我们必须放置任何其他数字成对的总和为3,6或9(或1的三联体)。我认为这不会太难实现。
对于N = 4,我们可以做类似于N = 2的事情。
我认为我们可以提出这样的情况,最多N = 10(N = 7可能很棘手)。然后,我们可以做任何N> 10通过考虑它。例如,如果N = 18,那么可以被N整除的任何和所有排列也可以被2和9整除。当然,如果N是素数,我们可能会遇到麻烦。
答案 2 :(得分:0)
我的想法:对S的数字进行排序增加和减少。现在你有了从S生成的最小值和最大值。现在在min,max区间中取N的所有倍数,看看它们由S中的数字形成。