题目链接

问题分析

奇奇怪怪的题。。。

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

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

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. CSM(Certified Scrum Master) 敏捷认证是什么?

    Scrum 是用于开发和持续支持复杂产品的一个框架.Scrum 基于试验性过程控制理论,借鉴了精益思想.时间盒.模块化设计等,并完整地体现了敏捷宣言和敏捷原则.Scrum 采用一种迭代.增量式的方法来 ...

  2. java 异常捕捉 ( try catch finally ) 你真的掌握了吗?

    掌握下面几条原则就可以完全解决“当try.catch.finally遭遇return”的问题. 原则:1.finally语句块中的代码是一定会执行的,而catch块中的代码只有发生异常时才会执行. 2 ...

  3. 动画方案 Lottie 学习(一)之基础

    参考 lottie系列文章(一):lottie介绍 lottie系列文章(二):lottie最佳实践 lottie系列文章(三):动画设计规范 lottie系列文章(四):源码分析——svg渲染

  4. Oracle连接字符串总结(转)

    Oracle XE 标准连接 Oracle XE(或者"Oracle Database 10g Express Edition")是一个简单免费发布的版本. 以下是语法格式: Dr ...

  5. centos7常见问题(更新。。。)

    1.网络设置 装好CentOS7后,我们一开始是上不了网的 DHCP 这时候,可以输入命令dhclient,可以自动获取一个IP地址,再用命令ip addr查看IP 不过这时候获取的IP是动态的,下次 ...

  6. 用 Portainer 远程管理 docker

    参考的官网地址为:https://portainer.readthedocs.io/en/stable/deployment.html 先更新Centos docker 镜像加速地址: curl -s ...

  7. 第六章· MySQL索引管理及执行计划

    一.索引介绍 1.什么是索引 1)索引就好比一本书的目录,它能让你更快的找到自己想要的内容. 2)让获取的数据更有目的性,从而提高数据库检索数据的性能. 2.索引类型介绍 1)BTREE:B+树索引 ...

  8. (七)make menuconfig

    1.make menuconfig进入图形界面后,输入 / 进行查找页面,如果输入有错,要删除前面输入的可以输入 ctrl加<--键(ctrl加回退按键)

  9. IPC之shm.c源码解读

    // SPDX-License-Identifier: GPL-2.0 /* * linux/ipc/shm.c * Copyright (C) 1992, 1993 Krishna Balasubr ...

  10. jQuery获取表单全部数据

    iQuery如何获取表单的全部数据,用于ajax提交 var formData = {}; var t = $('#Form').serializeArray(); $.each(t, functio ...