题意:
时间限制:1000ms
单点时限:1000ms
内存限制:512MB
描述
Recently, Nvoenewr learnt palindromes in his class.A palindrome is a nonnegative integer that is the same when read from left to right and when read from right to left. For example, 0, 1, 2, 11, 99, 232, 666, 998244353353442899 are palindromes, while 10, 23, 233, 1314 are not palindromes.Now, given a number, Nvoenewr can determine whether it’s a palindrome or not by using loops which his teacher has told him on the class. But he is now interested in another question: What’s the K-th palindrome? It seems that this question is too difficult for him, so now he asks you for help.Nvoenewr counts the number from small to big, like this: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 22, 33, 44, 55, 66, 77, 88, 99, 101 and so on. So the first palindrome is 0 and the eleventh palindrome is 11 itself.
Nvoenewr may ask you several questions, and the K may be very big.
输入
The first line contains one integer T(T <= 20) —— the number of questions that Nvoenewr will ask you.Each of the next T lines contains one integer K. You should find the K-th palindrome for Nvoenewr.Let’s say K is a n-digit number. It’s guaranteed that K >= 1, 1 <= n <= 100000 and the sum of n in all T questions is not greater than 1000000.
输出
Print T lines. The i-th line contains your answer of Nvoenewr’s i-th question.
样例输入
4
1
10
11
20
样例输出
0
9
11
101
翻译成汉语就是问第n个回文数是多少?n的长度范围是1e5
思路:
队友当时告诉我用数位dp做,然后我想了一手觉得还是找联系吧。然后发现只要处理前九位就能填满1e5的数据范围。。直到错了两发才发现,他喵的n的数据范围不是1e5,而是n的数字长度为1e5。好吧,即然这样肯定是有规律了,然后就利用之前处理的前1e9个打表找到其中的规律然后Accept(规律见代码)
代码:
#include <stdio.h>
#include <string.h>
#define N 100000
char s[N + 5];
int main () {
int T;
scanf("%d", &T);
while (T --) {
scanf("%s", s);
int len = strlen(s);
if (len == 1) {
printf("%d\n", s[0] - '0' - 1);
continue;
}
if(len == 2 && s[0] == '1' && s[1] == '0') {
printf("9\n");
continue;
}
if (s[0] == '1') {
if (s[1] == '0') {
printf("9");
for (int i = 2; i < len; i++) {
printf("%c", s[i]);
}
for (int i = len - 2; i > 1; i--) {
printf("%c", s[i]);
}
printf("9\n");
} else {
for (int i = 1; i < len; i++) {
printf("%c", s[i]);
}
for (int i = len - 1; i > 0; i--) {
printf("%c", s[i]);
}
printf("\n");
}
} else {
printf("%d", s[0] - '0' - 1);
for (int i = 1; i < len; i++) {
printf("%c", s[i]);
}
for (int i = len - 2; i > 0; i--) {
printf("%c", s[i]);
}
printf("%d\n", s[0] - '0' - 1);
}
}
return 0;
}
如果有写的不对或者不全面的地方 可通过主页的联系方式进行指正,谢谢