由模数中给定多位数字的第K个词典排列形成的计算数

时间:2017-03-22 21:06:27

标签: algorithm combinatorics

您获得 Q 查询。每个查询都会为您提供多个 S 的数字0到9以及一个整数 k 。系统会要求您确定 S 第k 字典排列的整数表示,模10 ^ 9 + 7

限制和其他说明:

  • K< = 10 12

  • Q< = 5000

  • S最多包含70,000个数字

  • 由n阶排列表示的整数,p = {p n-1 ,p n-2 ,...,p 1 ,p 0 }等于p i * 10 i 的总和-1。例如,置换{2,0,1}给出整数201.置换也可以从多个0-s开始,例如,置换{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与可能的排列数相比相对较小,因此这可能会为某些优化提供空间。

1 个答案:

答案 0 :(得分:1)

  

我尝试通过常规方法找到第k个排列

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

  

然后简单地计算模数,但它不够快

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

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