传送门


题目大意

回文数字是指合法的字符串数字,然后是回文字符串。输出第k(k≤10100000)k(k \leq 10^{100000})k(k≤10100000)个回文字符串。

解题思路

kkk这么大,显然是找规律的题目,那么不难发现回文数的个数应该按照位数来看,然后找到每个区间:

  • 位数为111:[0,9][0,9][0,9]共101010个;包含的个数区间为[1,10][1,10][1,10]
  • 位数为222:[11,99][11,99][11,99]共999个;包含的个数区间为[11,19][11,19][11,19]
  • 位数为333:[101,191],[202,[292],...,[909,999][101,191],[202,[292],...,[909,999][101,191],[202,[292],...,[909,999]共909090个;包含的个数区间为[20,109][20,109][20,109]
  • 位数为444:[1001,1991],[2002,[2992],...,[9009,9999][1001,1991],[2002,[2992],...,[9009,9999][1001,1991],[2002,[2992],...,[9009,9999]共909090个;包含的个数区间为[110,199][110,199][110,199]
  • 位数为555:[10001,19991],[20002,[29992],...,[90009,99999][10001,19991],[20002,[29992],...,[90009,99999][10001,19991],[20002,[29992],...,[90009,99999]共900900900个;包含的个数区间为[200,1099][200,1099][200,1099]
  • 位数为666:[100001,199991],[200002,[299992],...,[900009,999999][100001,199991],[200002,[299992],...,[900009,999999][100001,199991],[200002,[299992],...,[900009,999999]共900900900个;包含的个数区间为[1100,1999][1100,1999][1100,1999]

对于一个超大的给定的kkk,我们需要首先确定它在哪个区间内,这个我们可以预处理每个区间的左端点(有规律的),然后分奇偶找每种区间的规律,对于第iii个长度为xxx的区间,k−Li∈[0,x−1]k-L_i \in [0,x-1]k−Li​∈[0,x−1],然后我们找规律发现:

  • 若iii为奇数,那么将上面作差的结果对齐为⌊delta2⌋+1\lfloor \frac{delta}{2}\rfloor + 1⌊2delta​⌋+1,然后从左到右除第一位的每一位都是长度为iii位的答案从左到右的每一位,这里先不考虑回文的对称(第一位需要加上1)
  • 若iii为偶数,那么将上面作差的结果对齐为⌊delta2⌋\lfloor \frac{delta}{2}\rfloor⌊2delta​⌋,然后从左到右除第一位的每一位都是长度为iii位的答案从左到右的每一位,这里先不考虑回文的对称(第一位需要加上1)

对于第一步如何找到对应的左端点,我一开始写预处理,然后MLEMLEMLE了,然后每次O(n)O(n)O(n)去找,结果
TLETLETLE了,然后仔细观察,只需要看kkk的位数会落在哪些区间——对于给定位数的数只可能在三个区间内,且是有规律的,那么我们每次都处理出这三个左端点看在哪个左端点的区间内即可。

#include <bits/stdc++.h>using namespace std;
#define ENDL "\n"
const int maxn = 1e5 + 10;string sub(string a, string b, int len) {  //大数减法int len1 = a.size(), len2 = b.size();string c = "";int cnt = len1 - len2;while (cnt--) c += '0';c += b;for (int i = len1 - 1; i >= 0; i--) {if (a[i] >= c[i]) {a[i] = (a[i] - '0') - (c[i] - '0') + '0';} else {int j = i - 1;while (j > 0 && a[j] == '0') j--;a[j] = (a[j] - '0') - 1 + '0', j++;while (j <= i) a[j] = (a[j] - '0') + 10 + '0', j++;a[i] = (a[i] - '0') - (c[i] - '0') + '0';}}string ans = "";int x = len1 - len;// cout << len << " " << x << endl;for (int i = x; i < len1; i++) ans += a[i];return ans;
}inline int cmp(const string &s1, const string &s2) {if (s1.size() > s2.size()) return 1;if (s1.size() < s2.size()) return -1;for (int i = 0; i < s1.size(); i++) {if (s1[i] > s2[i])return 1;else if (s1[i] < s2[i])return -1;}return 0;
}int pos;  //最后答案的长度
string L[5];string Find(string s) {int len = s.size();L[1] = L[2] = L[3] = L[4] = "";L[1] += '2';for (int i = 1; i <= len - 2; i++) L[1] += '0';L[2] += "11";for (int i = 1; i <= len - 2; i++) L[2] += '0';L[3] += '2';for (int i = 1; i <= len - 1; i++) L[3] += '0';L[4] += "11";for (int i = 1; i <= len - 1; i++) L[4] += '0';for (int i = 1; i <= 3; i++) {if (cmp(s, L[i]) >= 0 && cmp(s, L[i + 1]) < 0) {pos = len * 2 - 4 + i;return L[i];}}
}int main() {ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);int t;string k;cin >> t;while (t--) {cin >> k;if (k.size() == 1) {cout << (char)(k[0] - 1) << ENDL;continue;}if (k == "10") {cout << "9" << ENDL;continue;}if (cmp(k, "11") >= 0 && cmp(k, "19") <= 0) {k[0] = k[1];cout << k << ENDL;continue;}string L = Find(k), res, temp = "", ans = "";//cout << L << " " << pos << endl;if (pos & 1) {res = sub(k, L, pos / 2 + 1);// cout << res << endl;temp += (res[0] - '0') + 1 + '0';for (int i = 1; i < res.size(); i++) {temp += res[i];}ans = temp;for (int i = temp.size() - 2; i >= 0; i--) ans += temp[i];} else {res = sub(k, L, pos / 2);// cout << res << endl;temp += (res[0] - '0') + 1 + '0';for (int i = 1; i < res.size(); i++) {temp += res[i];}ans = temp;for (int i = temp.size() - 1; i >= 0; i--) ans += temp[i];}cout << ans << ENDL;}return 0;
}

2018 ICPC 北京区域赛 I - Palindromes(规律+大数+模拟)相关推荐

  1. 2018 ICPC 焦作区域赛 Resistors in Parallel(找规律+大数)

    传送门 题目大意 给出电阻的并联公式,规定一个含有平方因子的数的1R=0\frac{1}{R}=0R1​=0.定义一个数的阻值为其所有的因子阻值并联求出的结果,问nnn以内并联后的最大的阻值是多少,输 ...

  2. 2018 icpc北京网络赛C cheat 模拟

    这题就是一个模拟.比赛时候还有三个多小时,当时也没有开别的题,终于等到了模拟.(本弱鸡模拟选手终于有时间写模拟了). 反正写模拟最主要的就是要自己思路清晰,写之前我自己开了一个txt,吧每个人的游戏策 ...

  3. 2018 ICPC北京网络赛 C. Cheat (模拟)

    题目链接 恶心的大模拟-- 4个人打牌轮流出牌(当前轮次应出的牌按照A-K顺序循环),同时声明所出的牌,且这个声明可能为假,出牌后其他人可以选择质疑他的声明.质疑时,若当前声明为真,质疑者拿走桌面上所 ...

  4. 2018 ACM-ICPC亚洲区域赛 北京赛区

    2018 ACM-ICPC亚洲区域赛 北京赛区 A - Jin Yong's Wukong Ranking List HihoCoder - 1870 题意 给N对关系,每对关系表示为A 比B 厉害, ...

  5. 2016 ICPC 北京网络赛 A 恶心模拟 F 循环矩阵,FFT(待补) I 模拟

    2016 ICPC 北京网络赛 A - The Book List 题意:每本书有所属种类,给出原生的存放方式,求按新的方式存放的样子. tags:坑到心态爆炸的题==  直接堆进vector里搞的, ...

  6. icpc西部区域赛_ICPC西部区域赛捷报传来!

    ICPC西部区域赛(新疆赛区)圆满结束软件学子斩获佳绩 2020年10月31日,由新疆大学信息科学与工程学院(网络空间安全学院)承办的ICPC国际大学生程序设计竞赛2020年西部区域赛(新疆赛区)圆满 ...

  7. 2020年 ICPC 亚洲区域赛(上海)G-Fibonacci

    ICPC 亚洲区域赛(上海) G-Fibonacci 题目 斐波那契数列为1,1,2,3,5,8,13,21,- 可以看到,这个数列有以下特点: 奇,奇,偶,奇,奇,偶- 当 xxx 与 yyy 相乘 ...

  8. 2018年 ACM/ICPC亚洲区域赛 青岛赛区现场赛 比赛总结

    首先祝贺自己收获了ACM生涯中的第二枚铜牌. 首先吐槽一下中石油: 周六早上来到中国石油大学,连个志愿者小姐姐都没看到.(但是看到了女装大佬).报完到之后发现教练少了一张午餐券(要不要这么粗心).为了 ...

  9. (2015)北京区域赛总结+回忆录

    从去年7月跟着学长们入坑,到今年11月去北京比赛,一年多的时间就这样转眼度过,现在坐在电脑面前码字时大脑却一片空白,不知道从何说起.想起去年暑假的时候,每天都是8点多到实验室晚上10点回宿舍,顿顿和学 ...

  10. icpc西部区域赛_信息学子在ACMICPC 2020中国(西部)大学生程序设计竞赛中喜获佳绩...

    2020年10月31日ACM-ICPC 2020中国(西部)大学生程序设计竞赛圆满结束,信息科学与工程学院组织51支队伍参赛,荣获2枚金牌,4枚银牌,17枚铜牌,成绩优异. 国际大学生程序设计竞赛(简 ...

最新文章

  1. 文档过期打不开怎么办_网络上下载文档,常见的3个问题,一招教你快速解决!...
  2. python 数据分析学什么-数据分析培训学习多久?都学什么?
  3. unite testing
  4. 【转】运输层TCP协议详细介绍
  5. js-innerHTML
  6. BugkuCTF-MISC题好多数值
  7. 设计模式之我见系列——策略模式
  8. CEF3:https 请求返回状态码canceled
  9. TypeScript入门教程 之 类/抽象类/构造器/Getter/Setter
  10. LeetCode 454. 4Sum II
  11. ModuleNotFoundError: No module named ‘exceptions‘
  12. PHP正则匹配6到16位字符组合(且只能为数字、字母、下划线)
  13. 十六进制编辑器--HxD和FlexHex
  14. 4.3 木马隐藏分析
  15. java实时监控系统_JavaMonitor
  16. [Halcon例程学习]增强指纹纹理的coherence_enhancing_diff
  17. dsp28335杂记2
  18. apex数据中心怎么切换服务器,Apex英雄怎么切换服务器
  19. 【FPGA——工具篇】:Xilinx_ISE_12.4安装包下载百度云网盘
  20. 【软件工程-Teamwork 2】必应词典软件手机版测试报告

热门文章

  1. Android studio2.0在app中设置背景图片及添加图片资源
  2. Centos6.X升级至Centos7.2升至Centos7.9详细步骤和踩过的坑(升级者必看~)
  3. 【深度学习之美】全面连接困何处,卷积网络见解深(入门系列之九)
  4. python炒股代码_python简单代码_趣炒股网页版
  5. APtos 简介及机制
  6. Fallback class must implement the interface annotated by @FeignClient
  7. c语言编程情话,c语言浪漫情话
  8. 亚马逊跨境电商开店注册流程之日本,澳洲,印度,中东,新加坡,巴西,土耳其
  9. activiti-邮件任务
  10. Material Design系列,自定义Behavior实现Android知乎首页