[YZOJ1062][NOIP福建夏令营]记分牌

来源:互联网 发布:ei数据库检索入口 编辑:程序博客网 时间:2024/04/27 11:39

题目描述
给定一个数 m 以及 m 个数 N1,N2,N3...Nm 。只用这 m 个数以从小到大的排列方式来表达所有能表达的数字。必有一个数是0
比如:如果有五个数 {0, 1, 2, 6, 9},则 {0, 1, 2, 6, 9, 10, 12, 16…}分别表示:{0, 1, 2, 3, 4, 5, 6, 7}。
给定两个数 X,S, X是仅由这m个数组成的一个数。输出X表示的数以及S转换后的形式。
数据范围
对于 20% 的数据, m3
对于 40% 的数据, X32767S32767
对于 100% 的数据, 2m10X2,147,483,647


那么这道题目怎么做呢?我们先把这道题目简化一下。
简化版题目《小妖数》:
简化版题面《小妖数》
看到数据范围:1<k<101001 是不是觉得暴力不可做?
很好,看来你已经放弃写暴力了。那么我们来看看怎么做。
如果一个数是小妖数,那么这个数一定仅由6与8构成。
那么我们是不是可以把6看做是0,把8看做是1,然后将小妖数化作一个二进制数?
比如一个数:888668868, 可以转化为111001101,也就是461。
反过来,如果我们把输入的k转化为二进制,然后把这个二进制数用上面的转换规则一一对应,是否能得到第k个小妖数?
答案是否定的。如果我们输入1,转换后的二进制数为 (1)2 根据上面的规则第一个数就是8,这明显是不对的。所以应该将 k1 化为二进制数,进行上述操作,即可得到正解。


回到这道题目,是不是就有了啥思路?这道题目和上述的小妖数有异曲同工之妙,只是将二进制的转换操作换成了m进制。


顺便科普一下进制转换方法:
十进制数 N 转m进制 :
Nmodm 存入数组中,然后将 Nmmodm 存入数组中,然后将 Nmmmodm 存入数组中,以此类推,直到N为0为止。(实际上不会到0,但是在写整数运算的时候会自动取0)
这个m进制数就是将整个数组倒过来输出的数。
m进制数 (N)m (2<=m<10) 转十进制
十进制数为N的各位上的数乘以 mi1(i为当前级位)的和。
设这个数N可以用一个数组 M 来表示,总长为 n。那么该十进制数为
ni=1Mimi1

如果题解有误请及时提出!