CF1216E Numerical Sequence
问题分析
奇奇怪怪的题。。。
首先思路达成一致,从大到小一步一步确定位置。
我们一边分析,一边讲算法。
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的更多相关文章
- [CF1216E] Numerical Sequence hard version
题目 The only difference between the easy and the hard versions is the maximum value of k. You are giv ...
- Numerical Sequence (easy version)
http://codeforces.com/problemset/problem/1216/E1 E1. Numerical Sequence (easy version) time limit pe ...
- cf1216E2 Numerical Sequence (hard version)(思维)
cf1216E2 Numerical Sequence (hard version) 题目大意 一个无限长的数字序列,其组成为\(1 1 2 1 2 3 1.......1 2 ... n...\), ...
- Numerical Sequence (Hard vision) 题解
The only difference between the easy and the hard versions is the maximum value of \(k\). You are gi ...
- cf1216E2 Numerical Sequence (hard version) 二分查找、思维题
题目描述 The only difference between the easy and the hard versions is the maximum value of k. You are g ...
- 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 ...
- EAPOL 协议
EAPOL 协议 一.基本概念 EAPOL 的全称为 Extensible Authentication Protocol Over LAN,即 EAP Over Lan,也即基于局域网的扩展认证协议 ...
- [转载]John Burkardt搜集的FORTRAN源代码
Over the years, I have collected, modified, adapted, adopted or created a number of software package ...
随机推荐
- CAS实现逻辑(JWT)
由于没有获取正规做CAS的流程,这里根据网上的资料,写了一个自己觉得还可以的方案流程,留着备用 名称介绍: token:用于验证请求是否合法 refreshToken:当token失效后,客户端发送t ...
- Zend 3.3.0安装 ZendOptimizer 3.3.0 for Windows 稳定版 下载
用的某php网站系统今天打开时乱码了(zend 200407...),但phpmyadmin能正常使用: 搜索下,重新安装zend可以解决,系统上原来的版本是Zend 3.3.0:下了个,安装后果然把 ...
- Web框架理解
目录 1.web框架理解 2.http工作原理 3.通过函数实现浏览器和服务端通信案例 4.服务器程序和引用程序理解 5.jinja2渲染模板案例 6.Djan ...
- 最新Cocoapods 安装及使用
1.移除现有Ruby默认源 gem sources --remove https://rubygems.org/ 2.使用新的源 gem sources -a https://ruby.taobao. ...
- Delphi最新的路线图
没想到,官方又发布了一个路线图,同上一个相比,多了10.3.3版本,而其中,最主要的iOS 13支持,即下半年发布的新的苹果系统,再一个就是android 64的delphi支持!年底前发布,够官忙伙 ...
- 用NetHttpClient执行Post操作遇到的问题
最近在做接口的调试,用NetHttpClient来进行相关操作.部分数据是用get方法来操作的,没有问题,但有个数据是用Post来操作的,始终报错,用了抓包分析工具发现没有发送数据出去.但找不出代码的 ...
- multiple类型的select option在django后台如何取值
之前前端的select都是单选类型,在新的场景中允许用户选择多个条件, 前端的代码如下: <form action="{% url 'info:result-list' %}" ...
- Win7系统打开防火墙出现0x6D9错误的解决方法
防火墙是Windows系统内的一道屏障,开启防火墙可以对系统起到一定的保护作用,可以说非常重要.但是有些Win7系统用户在开启防火墙时会被系统提示出现0x6D9的错误代码,从而不能打开防火墙. 当我们 ...
- 需求分析&系统设计
这个作业属于哪个课程 课程链接 这个作业要求在哪里 作业要求 团队名称 朋友 代打了解一下 这个作业的目标 需求分析&系统设计 一.团队成员的姓名学号列表 学号 姓名 特长 061126 黄天 ...
- MFC Bitmap::FromBITMAPINFO返回空问题
领导临时给了一个任务,项目上的一个问题,就是FromBITMAPINFO不成功,之前也没有弄过MFC的东西,但领导让干就干吧.咱也不知道怎么回事,咱也不敢问. 上来直接度娘,试过各种办法,都没与解决, ...