特定字符串的排列数可以被数字整除

时间:2011-11-25 09:20:43

标签: algorithm math

假设我有一个10位数的 multiset ,例如S = { 1, 1, 2, 2, 2, 3, 3, 3, 8, 9 }。有没有除暴力之外的任何方法来查找S元素的不同排列的数量,这样当排列被视为十位整数时,它可被特定数字n整除? n将在110000范围内。

例如:

如果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!种方式来置换其他元素,但有四对相同的元素)

3 个答案:

答案 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中的数字形成。