给定一个完全由小写英文字母组成的字符串等差递增序列,该序列中的每个字符串的长度固定为 L L L,从 L L L 个 a a a 开始,以 1 1 1 为步长递增。例如当 L L L 为 3 3 3 时,序列为 a a a , a a b , a a c , . . . , a a z , a b a , a b b , . . . , a b z , . . . , z z z aaa,aab,aac,...,aaz,aba,abb,...,abz,...,zzz aaa,aab,aac,...,aaz,aba,abb,...,abz,...,zzz。这个序列的倒数第 2 2 2 个字符串就是 z z y zzy zzy。对于任意给定的 L L L,本题要求你给出对应序列倒数第 N N N 个字符串。
输入格式
输入在一行中给出两个正整数 L L L ( 1 ≤ L ≤ 6 1≤L≤6 1≤L≤6)和 N N N( N ≤ 1 0 5 N≤10^5 N≤105).
注意:数据范围有修改!!!
输出格式
在一行中输出对应序列倒数第 N N N 个字符串。题目保证这个字符串是存在的。
样例输入
6 789
样例输出
zzzyvr
解题思路
把字符串看作 26 26 26进制:
0->a
1->b
2->c
...
25->z
然后把我们进制转换的辗转相除法拿出来:
int idx = len - 1;
while (num) {arr[idx--] = -(num % 26);num /= 26;
}
最后用zzz...z
减去我们求得的 26 26 26进制串即可。
AC代码如下:
#include <iostream>
using namespace std;
const int max_len = 10;
const int max_num = 1e5;int arr[max_len];int main() {int len, num;cin >> len >> num;num--;int idx = len - 1;while (num) {arr[idx--] = -(num % 26);num /= 26;}for (int i = 0; i < len; i++) {printf("%c", char(arr[i] + 122));}return 0;
}