代码源:841、倒数第n个字符串

184 阅读2分钟

本文已参与[新人创作礼]活动,一起开启掘金创作之路 logo.png

题目描述

这是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;
}