本文已参与[新人创作礼]活动,一起开启掘金创作之路
题目描述
这是4月25日代码源div2的每日一题。
倒数第n个字符串 - 题目 - Daimayuan Online Judge
给定一个完全由小写英文字母组成的字符串等差递增序列,该序列中的每个字符串的长度固定为 L,从 L 个 a 开始,以 1 为步长递增。例如当 L 为 3 时,序列为 aaa,aab,aac,...,aaz,aba,abb,...,abz,...,zzz。这个序列的倒数第 2 个字符串就是 zzy。对于任意给定的 L,本题要求你给出对应序列倒数第 N 个字符串。
输入格式
输入在一行中给出两个正整数 L (2≤L≤6)和 N( N≤10^5).
输出格式
在一行中输出对应序列倒数第 N 个字符串。题目保证这个字符串是存在的。
样例输入
6 789
样例输出
zzzyvr
\
问题解析
这题其实和进制转化差不多,把一个数转化成26进制的数,0~25对于26个字母。
但是直接转进制是有问题的,因为前置条件有两种,一种是在他给的长度为基础上算,比如这里给的长度L是6,那就是以aaaaaa的基础来算,第二点他给的是倒数的顺序而不是正数。
其实很好办,既然是倒数,我们直接求出最末尾一位的字符串转化成10进制的样子,比如这里长度L是6,最后一位应该是zzzzzz,这是倒数第1个字符串,然后我们要算倒数第N,就用这个数减去N+1即可。再用得到的数通过进制转换求出字符串。
AC代码
#include<iostream>
using namespace std;
#include<vector>
#include<algorithm>
#include<math.h>
#include<set>
#include<numeric>
#include<string>
#include<string.h>
#include<iterator>
#include<map>
#include<unordered_map>
#include<stack>
#include<list>
#include<queue>
#include<iomanip>
#define endl '\n';
typedef long long ll;
typedef pair<ll, ll>PII;
const int N = 1e6 + 50;
int main()
{
int l, n;
cin >> l >> n;
ll ans = pow(26, l);
ll res = ans - n;
string s;
if (res == 0)
{
for (int i = 0; i < l; i++)s += 'a';
}
else
{
while (res)
{
s = (char)(res % 26 + 'a') + s;
res /= 26;
}
}
cout << s << endl;
return 0;
}