有N种颜色的珠子。你有第 i 个颜色的双珠。您想通过将所有珠子连接在一起来制作装饰品。您可以使用以下算法创建装饰品:
步骤#1 以任何顺序排列所有珠子,使相同颜色的珠子放在一起。
步骤#2 装饰品最初仅由排列中的第一个珠子组成。
步骤#3 对于每个后续的珠子,将其连接到装饰品中相同颜色的珠子上。如果没有相同颜色的珠子,它可以连接到装饰品中的任何珠子上。
所有珠子都是不同的,即使它们具有相同的颜色。按照上面的算法可以形成多少种不同的饰品?如果两个珠子在一种配置中通过线连接,但在另一种配置中不连接,则认为两种装饰品不同。
澄清
把珠子的形成想象成一棵树,而不是一条直线。任何数量的珠子都可以连接到一个珠子上。
这个问题快把我逼疯了!我听说你必须使用 Cayleys 算法来获得为每个颜色 ci 的珠子构建一棵树的所有方法,然后你必须将这些树连接在一起。据说有这个公式将组件连接到树中,(s1s2...sk) × nk - 2,但我不确定我的公式是否正确,也不相信。有没有人熟悉这个公式,或者可以帮助我解决这个问题。多谢你们。哦,顺便说一句,这是我到目前为止的算法。它正在处理一些测试用例,但也失败了。
公共类珠饰{
public static void main(String[] args) {
Scanner stdin = new Scanner(System.in);
int T, N;
T = stdin.nextInt();
while (T-- > 0) {
N = stdin.nextInt();
double[] colors = new double[N];
double[] trees = new double[N];
long ornaments = 0;
for (int i = 0; i < N; i++) {
colors[i] = stdin.nextInt();
}
long t = 1;
for (int i = 0; i < N; i++) {
trees[i] = Math.max(Math.pow(colors[i], colors[i] - 2), 1);
t *= trees[i];
}
long s = 1;
if (N > 1) {
for (int i = 0; i < N; i++) {
s *= colors[i];
}
s *= Math.max(Math.pow(N, colors.length - 2), 1);
}
ornaments = s * t;
System.out.println(ornaments);
}
}
}