题目描述
给定一个数
m
以及
比如:如果有五个数 {0, 1, 2, 6, 9},则 {0, 1, 2, 6, 9, 10, 12, 16…}分别表示:{0, 1, 2, 3, 4, 5, 6, 7}。
给定两个数
数据范围
对于 20% 的数据,
m≤3
对于 40% 的数据,
X≤32767,S≤32767
对于 100% 的数据,
2≤m≤10,X≤2,147,483,647
那么这道题目怎么做呢?我们先把这道题目简化一下。
简化版题目《小妖数》:
看到数据范围:
1<k<101001
是不是觉得暴力不可做?
很好,看来你已经放弃写暴力了。那么我们来看看怎么做。
如果一个数是小妖数,那么这个数一定仅由6与8构成。
那么我们是不是可以把6看做是0,把8看做是1,然后将小妖数化作一个二进制数?
比如一个数:888668868, 可以转化为111001101,也就是461。
反过来,如果我们把输入的k转化为二进制,然后把这个二进制数用上面的转换规则一一对应,是否能得到第k个小妖数?
答案是否定的。如果我们输入1,转换后的二进制数为
(1)2
根据上面的规则第一个数就是8,这明显是不对的。所以应该将
k−1
化为二进制数,进行上述操作,即可得到正解。
回到这道题目,是不是就有了啥思路?这道题目和上述的小妖数有异曲同工之妙,只是将二进制的转换操作换成了m进制。
顺便科普一下进制转换方法:
十进制数
N
转m进制 :
将
这个m进制数就是将整个数组倒过来输出的数。
m进制数
(N)m
(
2<=m<10
) 转十进制
十进制数为N的各位上的数乘以
mi−1
(i为当前级位)的和。
设这个数N可以用一个数组
M
来表示,总长为
∑ni=1Mi∗mi−1
如果题解有误请及时提出!