您获得 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。
一些例子:
对于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与可能的排列数相比相对较小,因此这可能会为某些优化提供空间。
答案 0 :(得分:1)
我尝试通过常规方法找到第k个排列
不确定您的常用方法是什么。第k次置换可以在O(| S |)时间内获得,我假设你正在使用它。
然后简单地计算模数,但它不够快
请注意,对于多个查询,您具有相同的S大小。你应该建立数组D,D [i] = 10 ^ i%M,然后对于每个给定的排列,简单地找到D [i] * S [p [i]]%M的和 - 再次,线性时间。
实际上,因为k < 15!只有最后15位数改变了他们的顺序,所有查询之前的所有内容都需要只计算一次。