题目链接

问题分析

奇奇怪怪的题。。。

首先思路达成一致,从大到小一步一步确定位置。

我们一边分析,一边讲算法。

112123123412345123456123456712345678123456789123456789101234567891011123456789101112

假设我们现在要找的是这个串中的倒数第二个位置(就是1),我们可以这样做:

首先,我们想象着把串分开,变成

1
12
123
1234
12345
123456
1234567
12345678
123456789
12345678910
1234567891011
123456789101112

由于我们发现, 最后一个数字 位数相同 的串 的长度 是一个等差数列,可以方便地求得数列和。所以我们可以枚举 所求位置所在串 的 最后一个数字 的 位数。

在这个例子中,我们先枚举 最后一个数字 的 位数 为\(1\),可以算得这样的串的总长是 \((1+9)*9/2\)。发现不到所求位置,于是把这些串扔掉,顺便所求位置减\(45\)。

12345678910
1234567891011
123456789101112

然后枚举 最后一个数字 的 位数 为\(2\),可以算得这样串的总长是 \((11+(9+2*90))*90/2\)大于所求位置。

所以我们知道了 所求位置 所在串 的 最后一个数 的 位数 是 \(2\)。

然后同样的,根据这个等差数列,我们可以二分求得 所求位置 所在串 的 最后一个数 是多少。

这个例子中,最后锁定在串

123456789101112

然后……

我们可以重复上面的操作,把串分成

1 2 3 4 5 6 7 8 9 10 11 12

然后重复上面的第一步操作确定 所求位置 所在数 的 位数。只不过这次长度数列不再是等差数列,而是值等于数字位数的常数列。

在这个例子中,我们删掉了长度为\(1\)的,留下

10 11 12

然后可以直接算出 所求位置在 12 里。然后问题就解决了!

参考程序

#include <bits/stdc++.h>
#define LL long long
using namespace std; void Work() {
LL n;
scanf( "%lld", &n );
LL LastLen = 0, Len, Count;
for( Len = 1; ; ++Len ) {
Count = 9;
for( LL i = 1; i < Len; ++i )
Count = Count * 10;
LL Sum = ( LastLen + Len + LastLen + Count * Len ) * Count / 2;
if( n <= Sum ) break;
n -= Sum;
LastLen += Count * Len;
}
LL Left = 1, Right = Count, Mid, Ans;
while( Left <= Right ) {
Mid = ( Left + Right ) >> 1;
LL Sum = ( LastLen + Len + LastLen + Mid * Len ) * Mid / 2;
if( Sum >= n ) {
Ans = Mid;
Right = Mid - 1;
} else Left = Mid + 1;
}
--Ans;
n -= ( LastLen + Len + LastLen + Ans * Len ) * Ans / 2;
++Ans;
for( Len = 1; ; ++Len ) {
Count = 9;
for( LL i = 1; i < Len; ++i )
Count = Count * 10;
LL Sum = Count * Len;
if( Sum >= n ) break;
n -= Sum;
}
LL Num = ( n + Len - 1 ) / Len;
n = n - ( Num - 1 ) * Len;
LL T = 1;
for( LL i = 1; i < Len; ++i ) T = T * 10;
Num = T + Num - 1;
T = Len - n + 1;
for( LL i = 1; i < T; ++i ) Num = Num / 10;
printf( "%lld\n", Num % 10 );
return;
} int main() {
LL Query;
scanf( "%lld", &Query );
for( LL i = 1; i <= Query; ++i ) Work();
return 0;
}

CF1216E Numerical Sequence的更多相关文章

  1. [CF1216E] Numerical Sequence hard version

    题目 The only difference between the easy and the hard versions is the maximum value of k. You are giv ...

  2. Numerical Sequence (easy version)

    http://codeforces.com/problemset/problem/1216/E1 E1. Numerical Sequence (easy version) time limit pe ...

  3. cf1216E2 Numerical Sequence (hard version)(思维)

    cf1216E2 Numerical Sequence (hard version) 题目大意 一个无限长的数字序列,其组成为\(1 1 2 1 2 3 1.......1 2 ... n...\), ...

  4. Numerical Sequence (Hard vision) 题解

    The only difference between the easy and the hard versions is the maximum value of \(k\). You are gi ...

  5. cf1216E2 Numerical Sequence (hard version) 二分查找、思维题

    题目描述 The only difference between the easy and the hard versions is the maximum value of k. You are g ...

  6. Numerical Sequence(hard version),两次二分

    题目: 题意: 已知一个序列: 112123123412345123456123456712345678123456789123456789101234567891011... 求这个序列第k个数是多 ...

  7. 【二分】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 ...

  8. EAPOL 协议

    EAPOL 协议 一.基本概念 EAPOL 的全称为 Extensible Authentication Protocol Over LAN,即 EAP Over Lan,也即基于局域网的扩展认证协议 ...

  9. [转载]John Burkardt搜集的FORTRAN源代码

    Over the years, I have collected, modified, adapted, adopted or created a number of software package ...

随机推荐

  1. Python(六) —— 网络请求

    接口调用 接口调用有几个模块可以用:urllib 和 requests ,urllib 是内置的模块,极其不好用,强烈推荐用 requests 模块 get 请求 1.普通的 get 请求 impor ...

  2. Oracle数据库中的变量

    Oracle数据库中的变量 来源:https://blog.csdn.net/wahaa591/article/details/46772769 1.define(即host变量) define va ...

  3. HTML5之客户端存储(Storage)

    关于客户端存储技术 storage 一.关于客户端(浏览器)存储技术 浏览器的存储技术第一个能想到的应该就是cookie,关于cookie本身出现的初衷是为了解决客户端识别,可存储信息量小(4k左右) ...

  4. yocto project user’s guide

    http://www.yoctoproject.org/docs/2.1/ref-manual/ref-manual.html 参考手册 http://www.yoctoproject.org/doc ...

  5. 基于UDS的BootLoader

    bootloader程序架构略有简化的bootloader图 这张图和恒润教程中的BootLoader流程大体是一致的. 疑问点 Q:图中的烧写顺序是34-36-34-36-34-36-37,但另一些 ...

  6. 打造高效 VIM

    删除空行 删除1到10行的空行 :1,10g/^$/d 命令行快捷命令 Bang(!)命令 上一条命令:!! 使用上一条命令的所有参数:!* 使用上一条命令的最后一个参数:!$ 使用上一条命令中除了最 ...

  7. CUDA和TensorFlow的版本匹配问题

    CUDA和TensorFlow的版本匹配问题 部分转载自博客:https://blog.csdn.net/MahoneSun/article/details/80809042 列举一些CUDA和Ten ...

  8. RabbitMQ各种交换机类型Exchange Types介绍

    最新版本的RabbitMQ有四种交换机类型,分别是Direct exchange.Fanout exchange.Topic exchange.Headers exchange. 一.Direct E ...

  9. Python twisted事件驱动网络框架 源码剖析

    一.Twisted简介 Twisted是一个事件驱动的网络框架,其中包含了诸多功能,例如:网络协议.线程.数据库管理.网络操作.电子邮件等. 事件驱动简而言之,事件驱动分为二个部分:第一,注册事件:第 ...

  10. Dijkstra 优先队列优化

    #include <iostream> #include <queue> #include <vector> using namespace std; ; stru ...