algorithm - 计算给定多组数字的第 K 次字典排列形成的数

标签 algorithm combinatorics

你有 Q 个问题。每个查询都会为您提供一个由数字 0 到 9 组成的多重集 S 和一个整数 k。您需要确定 Sk-th 字典排列的整数表示,模 10^9+7

限制和其他注意事项:

  • k<=1012

  • Q<=5000

  • S 最多包含 70.000 个数字

  • 由n阶排列表示的整数,p={pn-1,pn-2,...,p1,p0}等于pi*10i之和,对于0到n的所有i -1。例如,排列 {2,0,1} 给出整数 201。排列也可以以多个 0 开头,例如,排列 {0,0,0,1,2} 将给出整数 12。

  • 限时2秒

一些例子:

  • 对于 S={0,1},k=1,结果将为 1。

  • 对于 S={0,1},k=2: 10

  • 对于 S={0,1,2},k=1: 12

  • 对于 S={0,1,2},k=2: 21

  • 对于 S={0,1,2},k=5: 201

  • 对于 S={0,1,1},k=2: 101

我在寻找足够有效的解决方案时遇到了问题。我尝试通过通常的方法找到第 k 个排列,然后简单地计算模数,但速度不够快。我认为模数确实改变了很多东西。

我还观察到,与可能的排列数相比,k 相对较小,因此这可能为一些优化腾出空间。

最佳答案

I tried finding the k-th permutation via the usual method

不确定您常用的方法是什么。可以在 O(|S|) 时间内获得第 k 个排列,我假设您正在使用它。

then simply calculating the modulo, but it isn't fast enough

请注意,对于多个查询,您具有相同大小的 S。您应该构建数组 D,D[i] = 10^i % M,然后对于每个给定的排列,只需找到 D[i]*S[p[i]] % M 的总和 - 再次,线性时间。

实际上因为 k < 15!只有最后 15 位数字改变了它们的顺序,对于所有查询,它们之前的所有内容只需计算一次。

关于algorithm - 计算给定多组数字的第 K 次字典排列形成的数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42962663/

相关文章:

algorithm - 最低共同祖先算法的实际应用是什么?

c++ - 重复组合计数

algorithm - 找到与数据一致的分数的所有可能组合

Python - 生成符合条件的大型集合组合的最有效方法?

python - 组合数学实现和难题

c - 如何比较字符串 "partly"(返回匹配的字符数)?

c++ - Möller-Trumbore Ray-Tri 交集算法

algorithm - 将冒泡排序更改为插入排序,对迭代进行少量更改

java - Java 中 "^= "运算符的用途是什么?

algorithm - 限制星图之间的边数,使图是平面的