【基础练习】【数论/模拟】codevs1670 无穷的序列题解

文章被盗还是很严重,加版权信息

转载请注明出处 [ametake版权所有]http://blog.csdn.net/ametake欢迎来看看

题目:

题目描述 Description

有一个无穷序列如下: 110100100010000100000… 请你找出这个无穷序列中指定位置上的数字

输入描述 Input Description

第一行一个正整数N,表示询问次数; 接下来的N行每行一个正整数Ai,Ai表示在序列中的位置。

输出描述 Output Description

N行,每行为0或1,表示序列第Ai位上的数字。

样例输入 Sample Input

4

3

14

7

6

样例输出 Sample Output

0

0

1

0

数据范围及提示 Data Size & Hint

【数据范围】 对于100%的数据有N≤1500000,Ai≤10^9

我们观察序列,发现这个序列可以分为很多组,每一组为1和很多0 0的个数取决于他前面的1是第几个1

这道题目有好多做法,看数据规模,单个查询必须是O(1)的时间 但本体数据相当弱= =

先放上我自己的做法,和题解里一位同学是相似的,用模拟。

刚开始想的是存储每个位置上的数字直接查表,但显然空间不足。256M可以开一亿的数组,但本题需要十亿= =

所以改为用数组f[i]表示第i个1的位置 这样只需要五万左右 五万平方就是二十五亿了

之后对于每个询问查找有没有i使得f[i]==x即可

查找可以优化,优化为二分,还有更快的,利用每个1的位置都是n*(n+1)/2 将查找范围缩小为几个数

但是我的优化失败了= =好在数据很弱,从1到maxn查找就可以过

上代码

显然此题还有更多更好的做法,我来总结一下:

1.里奥的做法,直接解方程n*(n+1)/2=x的整数解 如果有就是1 否则是0

2.这种方法我不大理解

”判断8*a-7是否为完全平方数即可

即是否trunc(sqrt(8*a-7))=sqrt(8*a-7)“

3.一种数论方法:

只要求出距离k最近的1所在位置即可

不难发现  每一个出现1位置都符合n*(n+1)/2+1,于是进行以下推导:

设k=n*(n+1)/2(n为最近的1所在位置,k为询问的位数

则有2*k=n*(n+1)

可见n=trunc(sqrt(n*(n+1)))=trunc(sqrt(2*k))

求出n后只要判断k是否等于n*(n+1)/2+1即可

t:=trunc(sqrt(2*k));

if k<>(t*t+t) div 2+1 then

ans[i]:=0

else

ans[i]:=1;

有的地方不大懂 尤其是取整这里 trunc是去尾

4.另一种数论 与上方类似,但也有一段不大理解

假设我们遇到了一个输入n,并假设它处于第m组。

于是:0.5*(m-1)*m<n<=0.5*m*(m+1)

上式乘2,得到:m*(m-1)<2n<=m*(m+1)

放缩,得到:(m-1)*(m-1)<2n<(m+1)*(m+1)

这样,我们就只需要将2n开方再取整,那么得到的数字要么是m,要么是m-1,进行一下判断就可以轻松的求解出m

而m正好就是n在的组数!

这样,我们就用O(1)的方法求出了n在的组数。秒杀掉此题。

好吧,膜拜上面诸大神,题解多来自codevs

于是这道题就这么结束了 下午还是要加油啊

——溪云初起日沉阁,山雨欲来风满楼。

文章被盗还是很严重,加版权信息

转载请注明出处 [ametake版权所有]http://blog.csdn.net/ametake欢迎来看看

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-29 03:57:46

【基础练习】【数论/模拟】codevs1670 无穷的序列题解的相关文章

BZOJ1798题解 Seq维护序列题解 双tag裸线段树

BZOJ1798题解 Seq维护序列题解 双tag裸线段树 1798: [Ahoi2009]Seq 维护序列seq Time Limit: 30 Sec  Memory Limit: 64 MBSubmit: 5549  Solved: 1951[Submit][Status][Discuss] Description 老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成. 有长为N的数列,不妨设为a1,a2,…,aN .有如下三种操作形式: (1)把数列中的一段数全部乘一个值; (2)

python基础教程_学习笔记:序列-1

序列 数据结构:通过某种方式组织在一起的数据元素的集合,这些数据元素可以是数字或者字符,甚至可以是其他数据结构. python中,最基本的数据结构是序列. 序列中的每个元素被分配一个序号--即元素的位置,也称为索引.第一个索引是0,第二个是1,以此类推. 序列概览 python包含6种内建的序列:列表.元组.字符串.Unicode字符串.buffer对象和xrange对象. 列表和元组的主要区别在于,列表可以修改,元组不能. 使用后者的理由通常是技术性的,它与python内部的运作方式有关.这也

洛谷 P1795 无穷的序列_NOI导刊2010提高(05)

P1795 无穷的序列_NOI导刊2010提高(05) 题目描述 有一个无穷序列如下: 110100100010000100000… 请你找出这个无穷序列中指定位置上的数字 输入输出格式 输入格式: 第一行一个正整数N,表示询问次数: 接下来的N行每行一个正整数Ai,Ai表示在序列中的位置. 输出格式: N行,每行为0或l,表示序列第Ai位上的数字. 输入输出样例 输入样例#1: 复制 4 3 14 7 6 输出样例#1: 复制 0 0 1 0 说明 对于100%的数据有N≤1500000,Ai

洛谷——P1795 无穷的序列_NOI导刊2010提高(05)

P1795 无穷的序列_NOI导刊2010提高(05) 题目描述 有一个无穷序列如下: 110100100010000100000… 请你找出这个无穷序列中指定位置上的数字 输入输出格式 输入格式: 第一行一个正整数N,表示询问次数: 接下来的N行每行一个正整数Ai,Ai表示在序列中的位置. 输出格式: N行,每行为0或l,表示序列第Ai位上的数字. 输入输出样例 输入样例#1: 复制 4 3 14 7 6 输出样例#1: 复制 0 0 1 0 说明 对于100%的数据有N≤1500000,Ai

【基础练习】【区间DP】codevs3657 括号序列题解

题目描述 Description 我们用以下规则定义一个合法的括号序列: (1)空序列是合法的 (2)假如S是一个合法的序列,则 (S) 和[S]都是合法的 (3)假如A 和 B 都是合法的,那么AB和BA也是合法的 例如以下是合法的括号序列: (), [], (()), ([]), ()[], ()[()] 以下是不合法括号序列的: (, [, ], )(, ([]), ([() 现在给定一些由'(', ')', '[', ,']'构成的序列 ,请添加尽量少的括号,得到一个合法的括号序列. 输

csp-s模拟测试52平均数,序列题解

题面:https://www.cnblogs.com/Juve/articles/11602244.html 平均数: 第k个平均数不好求,我们考虑二分,转化成平均数小于x的有几个 虑把序列中的每个数减去 x,则我们只需求区间和小于 0 的区间数量. 我们对这个序列求前缀和,则区间[L,R]和小于 0 当且仅当 SL-1>SR, 答案即为前缀和序列 S 的逆序对数量,使用经典的归并排序即可解决 #include<iostream> #include<cstdio> #incl

【BZOJ-4522】密钥破解 数论 + 模拟 ( Pollard_Rho分解 + Exgcd求逆元 + 快速幂 + 快速乘)

4522: [Cqoi2016]密钥破解 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 290  Solved: 148[Submit][Status][Discuss] Description 一种非对称加密算法的密钥生成过程如下: 1.任选两个不同的质数p,q 2.计算N=pq,r=(p−1)(q−1) 3.选取小于r,且与r互质的整数e 4.计算整数d,使得ed≡1KQ/r 5.二元组(N,e)称为公钥,二元组(N,d)称为私钥 当需要加密

Codevs3657括号序列题解

题目描述 Description 我们用以下规则定义一个合法的括号序列: (1)空序列是合法的 (2)假如S是一个合法的序列,则(S)和[S]都是合法的 (3)假如A和B都是合法的,那么AB和BA也是合法的 例如以下是一些合法的括号序列: (),[],(()),([]),()[],()[()] 以下是一些不合法括号序列的: (,[,],)(,([]),([() 现在给定一些由"(",")","[","]"构成的序列 ,请添加尽

Python基础教程系列:五、序列

列表也是序列的一种,所以对于列表的操作同样适用于列表.也可以通过下标或者切片操作来访问某一个或者某个子列表.那么列表和字符串有什么区别呢?首先字符串必须只能由字符组成,即便字符串中有数字,那也是字符类型的数字,不可直接用于数学计算,其次,字符串中的字符具有不可变性.但是列表是可以保留任意数目的Python对象的灵活容器,就像一个大箱子,什么对象都可以往里放.列表具有元素可变性,在序列中,列表是唯一一种支持元素可变性的数据结构.列表在形式上类似于C.Java中的数组,但与数组还是有很大区别的.数组