给定两个数 N 和 M,找出满足以下条件的长度为 N 的数组的个数 -
例如,让
N = 3,M = 3
可能的数组是
[1, 2, 1]
[1, 3, 1]
[2, 1, 2]
[2, 3, 2]
[3, 1, 3]
[3, 2, 2]
因此输出为 6。
N 和 M 的范围是从 3 到 10^18,包括在内。
我能得到有关如何解决这个问题的任何提示吗?我试图找到一个数学公式,但它给出了 N > 4 的错误答案。
我的方法 ->
对于N = 3,第一位和最后一位是固定的,我们可以在中间放置M-1个元素。所以计数 = M * (M - 1)
对于 N = 4,公式变为 (M - 1) * (M - 2) * M
对于 N > 5,我想出了一个通用公式,但它给出了错误的答案。
答案 0 :(得分:1)
定义问题的另一种方法是找到用 M 种颜色为 N-1 节点循环着色的方法数,使得没有两个相邻节点具有相同的颜色。我们可以使用 deletion-contraction recurrence 来计算颜色。设 C(n, k)
是用 n
种颜色为 k
节点循环着色的方法数,P(n, k)
是为 n
节点着色的方法数k
颜色的路径。我们得到重复
C(2, k) = k (k−1), as you observed;
C(n, k) = k P(n, k) − C(n−1, k),
since an n-node cycle with an edge deleted is an n-node path,
and an n-node cycle with an edge contracted is an (n−1)-node cycle.
P(1, k) = k, obviously;
P(n, k) = k P(n−1, k) − P(n−1, k)
= (k−1) P(n−1, k)
since an n-node path with the first or last edge deleted
is an (n−1)-node path with an isolated node
that can be colored independently in one of k ways,
and an n-node path with an edge contracted is an (n−1)-node path.
我们可以为 P(n, k)
编写一个封闭式公式,并为 C(n, k)
获得一个新的循环:
P(n, k) = k (k−1)^(n−1)
C(n, k) = k (k−1)^(n−1) − C(n−1, k).
这个循环可以变成一个线性时间算法,或者如果你愿意,如果我们展开C(n, k)
,我们可以把它表示为一个交替和
n (n−i) (n-2)
C(n, k) = Sum (−1) k (k−1)^(i−1) + (−1) k (k−1)
i=3
然后向 WolframAlpha 索取 closed form。