找规律题的典范?

OEIS裸题 考场上让你用 OEIS 吗

题意

  link

题解

\(n\le 5\)

  打表

\(n\le 10^5\)

  发现不能直接求最优解,于是二分答案。

  验证答案时,先把前 \(2\) 个人放到 \(1,m\) 这两个位置,用一个堆维护每相邻两个位置的差值,每新来一个人时,取出最小的差值,均分成两半,各扔进堆。若取出的差值 \(\le 3\) 就判定答案不可行。

  然后考虑二分答案的上界 \(R\),不难发现 \(R\le 3n\),因为最终一定不可能存在大于 \(3\) 的差值,否则可以减小答案。

  时间复杂度 \(O(n\log_2 n)\)。

\(n\le 10^{18}\)

  依然二分答案 \(m\),考虑优化判定。

  手算发现,差值最多只有 \(2\log m\) 种,同一种差值可以一起均分。

  故从大到小递推并累加每种差值的出现次数,若累加到 \(n\) 时扫到的差值 \(\le 1\) 就判定答案不可行。

  需要用一个堆维护已经出现的差值,每次取最大值。

  时间复杂度 \(O(\log_2^3 n)\)。

\(n\le 10^{1000}\)

  以下是找规律题解,但做法可能和 loj 的题解不太一样,是 scb 大神犇猜的?(小声bb)

  我们发现把输入和输出交换一下,这似乎就是个简单 \(\text{dp}\) 题:设 \(f(i)\) 表示座位数为 \(i\),且第一个人坐在中间时最多能不相邻地坐下多少人,则有 $$f(i)=f(\lfloor \frac{i-3}{2}\rfloor)+f(i-3-\lfloor \frac{i-3}{2}\rfloor)+1$$

  即选取最中间的一个座位,那么它相邻的两个座位不能用了,剩下 \(i-3\) 个座位被平分成两半,每一半为一个后继状态。

  然后有 $$ans=f(i-4)+2$$

  即上面的 \(\text{dp}\) 转移是每次在一段座位的最中间放一个人,我们最后还要在两端放上一开始的两个人。

  题目是输入 \(ans\),输出 \(i\)。于是设 \(g\) 是 \(f\) 的逆函数,因为 \(ans-2=f(i-4)\),所以 \(g(ans-2)=i-4\),即 \(g(ans-2)+4=i\)。

  考虑如何快速求 \(g(n)\)(\(n\in N+\))。

  把 \(g\) 函数打个表,好像没规律。

  但是把 \(g\) 函数的每相邻两项的差分值打个表,发现差分值依次为 $$1,3,1,5,1,1,1,9,1,1,1,1,1,1,1,17,1,1,\cdots$$

  我们发现这个序列就是在全 \(1\) 的序列上 把第 \(2^1\) 位加 \(2^1\),把第 \(2^2\) 位加 \(2^2\),把第 \(2^3\) 位加 \(2^3\)……

  由于这是 \(g\) 的差分序列,前 \(n\) 项的和就是 \(g(n)\)。

  观察和的规律。第 \(1\) 个数为 \(2^0\),第 \(2-3\) 个数的和为 \(2^2\),第 \(4-7\) 个数的和为 \(2^3\),第 \(8-15\) 个数的和为 \(2^4\)……

  下标和数值都呈 \(2\) 的指数级增长。

  若把和看成一个二进制数,这个数不会超过 \(\log_2{10^{1000}}≈3000\) 位。

  由于最后一段是不完整的,我们单提出最后一段求和,再对前面 \(\log_2\) 个整段求和。

  求最后一段前 \(k\) 个数的和:发现该段第一个数就是上一段的总和 \(+1\),后面的数全是 \(1\),故递推时算一下当前扫到的段的和,从上一段的和加上 \(k\) 个 \(1\) 就是最后一段前 \(k\) 个数的和。然后计算 \(k\) 需要做一次高精度减法,上一段的和加 \(k\) 又需要做一次高精度加法,故时间复杂度是 \(O(3000)\)。

  求前面所有完整段的和:设总共有 \(k\) 段,则答案为 \(2^0+2^2+2^3+\cdots +2^k = 2^{k+1} - 1 - 2^1 = 2^{k+1} - 3\)。只需要做一次高精度减法,时间复杂度也是 \(O(3000)\)。

  最后要把 \(3000\) 位二进制数转十进制,这个就是从高到低每扫过一个二进制位时,把十进制数 \(\times 2\),若这个二进制位为 \(1\) 则十进制数还要 \(+1\)。

  只有最后的进制转化的时间复杂度最高,是 \(O(\log_2^2 n) ≈ 9\times 10^6\)。这部分据说可以 \(\text{FFT}\) 优化?不会,告辞。

  所以这都是经典数学问题嘛?规律这么神奇的

【LOJ 6695】天气之子的更多相关文章

  1. 冲刺CSP-S集训考试反思+其它乱写(密码私信)

    RT.开坑. 10.1 开门黑23333. 放假回来稍困,而且感冒似乎愈加严重,导致我正常考试基本睁不开眼.一个小时勉强把题读懂,神志恍惚如斯. 看T2觉得估计又是各种推柿子堆定理的数学大题,写了个暴 ...

  2. 决策树ID3算法

    决策树 (Decision Tree)是在已知各种情况发生概率的基础上,通过构成 决策树 来求取净现值的期望值大于等于零的概率,评价项目风险,判断其可行性的决策分析方法,是直观运用概率分析的一种图解法 ...

  3. python爬取豆瓣视频信息代码

    目录 一:代码 二:结果如下(部分例子)   这里是爬取豆瓣视频信息,用pyquery库(jquery的python库). 一:代码 from urllib.request import quote ...

  4. 2019 CSP-J 游记(CQ LNBS考场 的退役之战)

    T0.10 爆零之战 已经不是第一次参加NOIP了(哦,关于兔子也NOIP了) 这次比赛的话,感觉考场很温馨,键盘很舒适,老师很友善,下次还会来.(哦不,下次来不了了,即将提前退役[大雾]) 刚刚文化 ...

  5. test20190904 JKlover

    100+100+100=300.最后十分钟极限翻盘. 树链剖分 给一棵以1为根的有根树,开始只有1有标记. 每次操作可以给某个点打上标记,或者询问从某个点开始向上跳,遇到的第一个有标记的点. 对于 1 ...

  6. python flask框架学习(三)——豆瓣微信小程序案例(二)整理封装block,模板的继承

    我们所要实现的效果: 点击电影的更多,跳转到更多的电影页面:点击电视剧的更多,跳转到更多的电视剧页面. 三个页面的风格相同,可以设置一个模板,三个页面都继承这个模板 1.在指定模板之前,把css放在一 ...

  7. python flask框架学习(三)——豆瓣微信小程序案例(一)templates的使用,宏的使用,前端后台传数据,前端写python语句

    目录 一.templates的使用 (1)在templates里创建一个index.html (2)再在app.py里写 (3)展示效果 二.构建第一个电影评分 (1)准备好素材放进static里的i ...

  8. 日记 + sb错误

    置顶消息cpdd 1.29 完了,文化课没了 我是废物 1.28 更新了自己的副标题 前副标题:Future never has to do with past time,but present ti ...

  9. LoveWord

    个人喜欢的句子汇总! 我告诉你我喜欢你,并不是一定要和你在一起,只是希望今后的你,在遭遇人生低谷的时候,不要灰心,至少曾经有人被你的魅力所吸引,曾经是,以后也会是----村上村树

随机推荐

  1. NLP之中文自然语言处理工具库:SnowNLP(情感分析/分词/自动摘要)

    一 安装与介绍 1.1 概述 SnowNLP是一个python写的类库,可以方便的处理中文文本内容,是受到了TextBlob的启发而写的,由于现在大部分的自然语言处理库基本都是针对英文的,于是写了一个 ...

  2. cef加载flash的办法

    cef有2种加载flash插件的方式, 1,npapi,这种方式是调用系统自带的flash插件,由于有安全性方面的问题,已经被新版cef禁用. 2,ppapi,也就是 pepper flash,这是谷 ...

  3. redis缓存服务器

    1.什么是redis? Redis 是一个基于内存的高性能key-value数据库. 2.使用redis的好处? 速度快,因为数据存在内存,类似hashmap,hashmap的优势就是查找和操作的时间 ...

  4. Python面试简介及并行并发

    今天的分享内容大体如下: 一. 面试 1. 什么是面试 2. 优秀的面试 二. Python综述 1. Python设计哲学及版本变迁 2. Python发展现状及其他语言使用场景 3. GIL 4. ...

  5. 实验----Java的二维数组的应用及杨辉三角的编写

    (1) 编写一个程序,生成一个10*10的二维随机整数数组,并将该数组的每行最大值保存于一个一维数组中,将每列平均值保存于另外一个一维数组中并分别输出. (2) 编程输出杨辉三角的前10行. 找出一个 ...

  6. icon.css

    .icon-blank{ background:url('icons/blank.gif') no-repeat; } .icon-add{ background:url('icons/edit_ad ...

  7. Linux基础命令---间歇执行命令---watch

    [watch] watch指令可以间歇性的执行程序,将输出结果以全屏的方式显示,默认是2s执行一次. watch指令下发后,将会一直被执行,直到被中断. [语法] watch \ [-d h v t] ...

  8. SpringCloud之Zuul 自定义filter

    实现过滤器很简单,只需要继承ZuulFilter,并实现ZuulFilter中的抽象方法. filterType():定义过滤器的类型,它有4种类型,分别是pre.post.routing和error ...

  9. Git和Github的使用

    Git和Github的基本操作 一.了解Git和Github 1.什么是GIT? Git是一个免费.开源的版本控制软件 2.什么是版本控制系统? 版本控制是一种记录一个或若干个文件内容变化,以便将来查 ...

  10. 解决远程连不到CentOS7虚拟机或ifconfig中没有ens33

    在使用Secure CRT连接虚拟机连接不上,可能之前虚拟机关闭不当 登到虚拟机的中断使用ifconfig发现没有ens33 猜测是CentOS图形管理中的NetworkManager接管了网络配置, ...