Numerical Sequence (Hard vision) 题解
The only difference between the easy and the hard versions is the maximum value of \(k\).
You are given an infinite sequence of form "112123123412345…" which consist of blocks of all consecutive positive integers written one after another. The first block consists of all numbers from \(1\) to \(1\), the second one — from \(1\) to \(2\), the third one — from \(1\) to \(3\), …, the i-th block consists of all numbers from \(1\) to \(i\).
So the first \(56\) elements of the sequence are "11212312341234512345612345671234567812345678912345678910". Elements of the sequence are numbered from one. For example, the \(1\)-st element of the sequence is \(1\), the \(3\)-rd element of the sequence is \(2\), the \(20\)-th element of the sequence is \(5\), the \(38\)-th element is \(2\), the 56-th element of the sequence is \(0\).
Your task is to answer \(q\) independent queries. In the i-th query you are given one integer ki. Calculate the digit at the position ki of the sequence.
有一个无限长的数字序列,其组成为1 1 2 1 2 3 1.......1 2 ... n...,即重复的1 ~ 1,1 ~ 2....1 ~ n,这个数列连起来成为一个串,每位数字算一个元素,求第k(k<=1e18)个元素是什么
输入格式
The first line of the input contains one integer \(q(1≤q≤500)\) — the number of queries.
The i-th of the following q lines contains one integer \(k_i (1≤k_i≤10^{18})\) — the description of the corresponding query.
输出格式
Print q lines. In the i-th line print one digit \(x_i (0≤xi≤9)\) — the answer to the query i, i.e. xi should be equal to the element at the position ki of the sequence.
样例输入1
5
1
3
20
38
56
样例输出1
1
2
5
2
0
样例输入2
4
2132
506
999999999999999999
1000000000000000000
样例输出2
8
2
4
1
题解
首先把原数列变成这样:
1
12
123
1234
12345
123456
1234567
12345678
123456789
12345678910
1234567891011
123456789101112
12345678910111213
1234567891011121314
你会发现,这个形状抽象以下就是这样:

当然每一块实际上不是等高的,这个斜边斜率之所以会改变,是因为其最后一个数字位数不同,在第一块,每一行增加一位,第二组每一行增加2位...
我们只需要事先预处理出每块含数字的数量,然后拿到\(k\)以后,进行二分就能找到\(k\)在哪一块.
那么怎么预处理呢?
首先已知:
第一块第一行是1个数字
第一块每行增加\(1\)个,第二块每行增加\(2\)个,第三行每行增加\(3\)个,第\(i\)块每行增加\(i\)个,设为\(d_i\)
第一块有\(9\)行,第二块有\(90\)行,第三块有\(900\)行,第\(i\)块有\(9 \times 10^{i-1}\),设为\(l_i\)
那就可以用等差数列求和公式预处理
注意,每一块都有自己的通项公式,描述该块内第几行有多少数字
那么现在求每一块内数字数量的问题就变成了 已知首项和公差,求前\(n\)项和.
首项由前一块的通项公式得出,公差为\(d_i\), 由\(n=l_i\)可以求出该块数字数量,保存下来.
找到在哪一块之后,\(k\)减去前面所有块的数字数量,然后二分找到哪一行,每一行的数量由该块通项公式得出.
找到在哪一行之后,进行和以上类似的操作
比如这一行是
1
12
123
1234
12345
123456
1234567
12345678
123456789
12345678910
1234567891011
123456789101112
是不是似曾相识?

又是这个图,还是分块,分成1位数,2位数,3位数若干块(若干公差不同的等差数列),找到\(k\)在哪一块,然后枚举即可.
代码
#include <bits/stdc++.h>
using namespace std;
const int N = 10;
long long a[15], b[15], c[15], T, n;
int main() {
for (int i = 1; i <= N; i++) {
long long x = i, l = 1, r = 0;
while (x--) l *= 10, r = r * 10 + 9;
l /= 10;
a[i] = (r - l + 1) * i;
b[i] = b[i - 1] + a[i];
c[i] = c[i - 1] + (b[i - 1] + i + b[i]) * (r - l + 1) / 2;
}
scanf("%lld", &T);
while (T--) {
scanf("%lld", &n);
long long pos = lower_bound(c + 1, c + N + 1, n) - c, l = 1, r = 0,
x = pos, t;
n -= c[pos - 1];
t = b[pos - 1];
while (x--) l *= 10, r = 10 * r + 9;
l /= 10;
long long L = l;
while (l <= r) {
int mid = (l + r) >> 1, cnt = mid - L + 1;
if ((2 * t + pos + cnt * pos) * cnt / 2 >= n)
r = mid - 1;
else
l = mid + 1;
}
long long cnt = l - L;
n -= (2 * t + pos + cnt * pos) * cnt / 2;
pos = lower_bound(b + 1, b + N + 1, n) - b;
n -= b[pos - 1];
long long ans = 1;
for (long long i = 1; i < pos; i++) ans *= 10;
t = (n - 1) / pos;
n -= t * pos;
ans += t;
n = pos - n;
while (n--) ans /= 10;
printf("%lld\n", ans % 10);
}
return 0;
}
Numerical Sequence (Hard vision) 题解的更多相关文章
- cf1216E2 Numerical Sequence (hard version)(思维)
cf1216E2 Numerical Sequence (hard version) 题目大意 一个无限长的数字序列,其组成为\(1 1 2 1 2 3 1.......1 2 ... n...\), ...
- Numerical Sequence (easy version)
http://codeforces.com/problemset/problem/1216/E1 E1. Numerical Sequence (easy version) time limit pe ...
- [CF1216E] Numerical Sequence hard version
题目 The only difference between the easy and the hard versions is the maximum value of k. You are giv ...
- cf1216E2 Numerical Sequence (hard version) 二分查找、思维题
题目描述 The only difference between the easy and the hard versions is the maximum value of k. You are g ...
- CF1216E Numerical Sequence
题目链接 问题分析 奇奇怪怪的题... 首先思路达成一致,从大到小一步一步确定位置. 我们一边分析,一边讲算法. 1121231234123451234561234567123456781234567 ...
- [CF1177B]Digits Sequence (Hard Edition)题解
一个简单的模拟,首先先计算当前是几位数,然后根据几位数推断当前的数是什么,然后求出该位即可 #include <cstdio> int main(){ long long k; scanf ...
- Numerical Sequence(hard version),两次二分
题目: 题意: 已知一个序列: 112123123412345123456123456712345678123456789123456789101234567891011... 求这个序列第k个数是多 ...
- 【二分】CF Round #587 (Div. 3)E2 Numerical Sequence (hard version)
题目大意 有一个无限长的数字序列,其组成为1 1 2 1 2 3 1.......1 2 ... n...,即重复的1~1,1~2....1~n,给你一个\(k\),求第\(k(k<=10^{1 ...
- CF1177A Digits Sequence (Easy Edition) 题解
Content 一个序列由从 \(1\) 开始的数字不断在末端拼接,就像这样:\(12345678910111213141516...\).现在,给定一个数字 \(k\),请输出这个序列的第 \(k\ ...
随机推荐
- 【整理】JVM知识点大梳理
JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的.引入Java语 ...
- python3 后台维护软件
后台维护软件 一.思路: 登录: 1.用户登录(编写GUI用户登录界面) 使用模块:tkinter,pymssql 验证逻辑: 1.获取文本框输入数据. 2.进行空值值判断 if ...else... ...
- Spring Boot 集成 Swagger 构建接口文档
在应用开发过程中经常需要对其他应用或者客户端提供 RESTful API 接口,尤其是在版本快速迭代的开发过程中,修改接口的同时还需要同步修改对应的接口文档,这使我们总是做着重复的工作,并且如果忘记修 ...
- [寒假学习]ps知识
小学就开始学了,还是要感谢当时年轻不懂事到处研究怎么画画哈哈哈哈,不过到现在有点忘,寒假在家禁足也无聊,寻思着重拾画笔来着,复习一下,冲! 为了防止看完就忘用博客记录一下小笔记 1. 一些快捷键的 ...
- Hive中row_number()、dense_rank()、rank()的区别
摘要 本文对Hive中常用的三个排序函数row_number().dense_rank().rank()的特性进行类比和总结,并通过笔者亲自动手写的一个小实验,直观展现这三个函数的特点. 三个排序函数 ...
- Centos7上添加自定义服务文件并开机启动
Ⅰ-1 写服务文件 [Unit] ##服务的说明Description:描述服务After:描述服务类别 [Service] ##服务运行参数的设置Type=forking是后台运行的形式Ex ...
- SSH原理常见应用升级及端口转发
SSH介绍 SSH是Secure Shell Protocol的简写,由IETF网络工作小组(Network working Group)指定:在进行数据传输之前,SSH先对联机数据包通过加密技术进行 ...
- flutter-web利用dart js 库发起http request
初学flutter,初学前端,尝试在dart中直接使用HttpClient时,直接报出Platform not supported,查资料发现他还不支持浏览器. 通过查阅资料发现可以借助axios 与 ...
- Golang简单入门教程——函数进阶篇
本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是golang专题的第八篇,我们来聊聊golang当中的函数. 我们在之前的时候已经介绍过了函数的基本用法,知道了怎么样设计或者是定义一 ...
- [每日一题2020.06.08]洛谷P1605 DFS
今天cf又杯具的只写出2题, 虽然AB题20分钟左右就搞定了, 但是CD写了2个小时也没写出来 D题我用到了DFS, 虽然必不正确, 但是我至少发现了一个问题, 那就是我连DFS都忘了, 于是怒找DF ...