lfyzoj103 割海成路之日
问题描述
现在,摆在早苗面前的是一道简单题。只要解决了这道简单题,早苗就可以发动她现人神的能力了:
输出
\]
输入格式
第一行是一个整数 \(T\),代表有 \(T\) 组数据。
下来 \(T\) 行,一行一个整数 \(n\)。
输出格式
\(T\) 行,一行一个整数,是你的答案。
样例一
input
2
3
5
output
0
1
数据范围与约定
对于 \(30\%\) 的数据,\(T \leq 10\),\(n \leq 100\)。
对于 \(50\%\) 的数据,\(T \leq 100000\),\(n \leq 100000\)。
对于另外 \(30\%\) 的数据,\(T \leq 2\),\(n \leq 10^{12}-1\)。
对于所有的数据,\(1 \leq T \leq 1145140\),\(1 \leq n \leq 10^{18}-1\)。
时间限制: \(1\mathrm{s}\)
内存限制: \(256\mathrm{MB}\)
题解
本文整理自flyinghearts的博客。
记 \(f(x,y)\) 为从 \(x\) 一路异或到 \(y\) 的值。\(\mathrm{xor}\) 异或,\(\mathrm{or}\) 是或。
对于 \(f(2^k,2^{k+1}-1)\) 这 \(2^k\) 个数,它们的最高位显然是第 \(k\) 位。最高位的 \(1\) 的个数为 \(2^k\)。
\(k \geq 1\) 时, \(2^k\) 为偶数,\(\mathrm{xor}\) 下来成了 \(0\)。将这些数的最高位抹去,\(f\) 的值不变,则 \(f(2^k,2^{k+1}-1)=f(2^k-2^k,2^{k+1}-1-2^k)=f(0,2^k-1)\)。
则 \(f(0,2^{k+1}-1) = f(0,2^k-1)\ \mathrm{xor}\ f(2^k,2^{k+1}-1)=0\) 当 \(k \geq 1\) 时。
即 \(f(0,2^k-1)=0\) 当 \(k \geq 2\) 时。
对于 \(n \geq 4\),设其最高位 \(1\) 在第 \(k\) 位,则 \(k \geq 2\)。
\(f(0,n)=f(0,2^k-1)\ \mathrm{xor}\ f(2^k,n)=f(2^k,n)\)
对于 \(2^k \sim n\) 这 \(n-2^k+1\) 个数,最高位有 \(m=n-2^k+1\) 个 \(1\)。
\(n\) 与 \(n-2^k\) 同奇偶。
- 当 \(n\) 为奇数时
\(m\) 是偶数,则 \(f(2^k,n)=f(0,n-2^k)\)。
递降这个公式,也即相当于不断剥去 \(n\) 最高位的 \(1\),得到 \(f(0,n)=f(0,n \bmod 4)\)。
\(n \equiv 1 \pmod 4\) 时,\(f(1,n)=f(0,n)=f(0,1)=1\)。
\(n \equiv 3 \pmod 4\) 时,\(f(1,n)=f(0,n)=f(0,3)=0\)。
- 当 \(n\) 为偶数时
\(m\) 是奇数,则 \(f(2^k)=f(n-2^k)\ \mathrm{or}\ 2^k\)。
递降这个公式,得 \(f(0,n)=\eta\ \mathrm{or}\ f(0,n \bmod 4)\)。
其中 \(\eta\) 是 \(n\) 将第 \(0,1\) 位置 \(0\) 后的数。
\(n \equiv 0 \pmod 4\) 时,\(f(1,n)=f(0,n)=n\)。
\(n \equiv 2 \pmod 4\) 时,\(f(1,n)=f(0,n)=n+1\)。
综上所述
\begin{cases}
n, &n \equiv 0 \pmod 4\\
1, &n \equiv 1 \pmod 4\\
n+1, &n \equiv 2 \pmod 4\\
0, &n \equiv 3 \pmod 4\\
\end{cases}
\]
因此我们得到了 \(\mathrm{O}(1)\) 算法
lfyzoj103 割海成路之日的更多相关文章
- NOIP 模拟 $28\; \rm 割海成路之日$
题解 \(by\;zj\varphi\) 用两个集合分别表示 \(1\) 边联通块,\(1,2\) 边联通块 . \(\rm son_x\) 表示当前节点通过 \(3\) 类边能到的 \(2\) 联通 ...
- Solution -「LOCAL」割海成路之日
\(\mathcal{Description}\) OurOJ. 给定 \(n\) 个点的一棵树,有 \(1,2,3\) 三种边权.一条简单有向路径 \((s,t)\) 合法,当且仅当走过一条 ...
- 创成汇丨投脑风暴·创心不止|路演日 第2期,寻IT创业者
创成汇丨投脑风暴·创心不止|路演日 第2期 无畏荆棘之路的风雨 誓做浪潮之巅的勇者 你说,创业是一场孤注一掷的较量 你说,创新从来都是与过去battle 你还说,坚持总是比开始更让你难以琢磨 所以 ...
- BZOJ 1001 狼抓兔子 (最小割转化成最短路)
1001: [BeiJing2006]狼抓兔子 Time Limit: 15 Sec Memory Limit: 162 MBSubmit: 27715 Solved: 7134[Submit][ ...
- python之路--day8---day9--两日内容
一.不使用函数的问题 1,代码的组织结构不清晰,可读性差 2,遇到重复的功能只能重复编写实现代码,代码冗余 3,功能需要扩展时,需要找出所有实现该功能的地方修改,无法统一管理且维护难度极大 二.函数是 ...
- hdu3035 最小割转换成最短路
题意: 给你一个平面图,要求从求出从左上角到右下角的最小割. 思路: 如果大意的可能直接上来一遍最大流,然后就会各种悲剧的MLE,TLE,其实这个题目可以用到有个论文里面的那个 ...
- BZOJ_1001_狼抓兔子_(平面图求最小割+对偶图求最短路)
描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1001 1001: [BeiJing2006]狼抓兔子 Time Limit: 15 Sec ...
- Vijos1734 NOI2010 海拔 平面图最小割
建立平面图的对偶图,把最小割转化成最短路问题 Dijkstra算法堆优化 (被输入顺序搞WA了好几次T_T) #include <cstdio> #include <cstring& ...
- Luogu2046 NOI2010 海拔 平面图、最小割、最短路
传送门 首先一个不知道怎么证的结论:任意点的\(H\)只会是\(0\)或\(1\) 那么可以发现原题的本质就是一个最小割,左上角为\(S\),右下角为\(T\),被割开的两个部分就是\(H=0\)与\ ...
随机推荐
- wireshark工具集
tshark 查看pcap文件第一个包的时间,当文件名不包含时间信息时非常有帮助 tshark -c 1 -T fields -e frame.time -r test.pcap dumpcap ed ...
- SSAS中处理时经常出现的几种错误
1.[重复属性键的错误]"处理时找到重复的属性键" 当在[属性关系]里指定属性关系后, 就出出现此错误,因为不知道Month值“1”,并不知道是属于哪一年的, 所以需要 ...
- node项目 Error: Cannot find module 'mongoose'
这是因为你部署的项目没有添加mongoose,使用 在自己项目的根目录下:npm install mongoose --save
- I/O————字节流
InputStream字节输入流 OutputStream字节输出流 用于以字节的形式读取和写入数据 下面是使用 字节输入流读取文件字节输出流写入文件 文件可能不存在,所以使用try catch pu ...
- Android程序中使用iconfont心得
1.关于iconfont iconfont既是icon又是font,具体来说应该是用font形式展现的icon.与传统图片格式的图标不同,这一种图标因为是以字体形式展现的,所以更改大小.颜色.背景颜色 ...
- JS 操作对象 事件 样式
1.获取标记对象 css 1 - class 2 - id 3 - 标记选择器 js 1 - class 2 - id 3 - 标记 4 - name + document.getElementByI ...
- HDU 1693 Eat the Trees (插头DP)
题意:给一个n*m的矩阵,为1时代表空格子,为0时代表障碍格子,问如果不经过障碍格子,可以画一至多个圆的话,有多少种方案?(n<12,m<12) 思路: 这题不需要用到最小表示法以及括号表 ...
- UVA1515 Pool construction (最小割模型)
如果不允许转化'#'和'.'的话,那么可以直接在'#'和'.'之间连容量为b的边,把所有'#'和一个源点连接, 所有'.'和一个汇点连接,流量不限,那么割就是建围栏(分割'#'和'.')的花费. 问题 ...
- 集成iAd广告
在iPhone程序中集成广告,管他能不能赚钱,不放上一个iAd就心有不甘. 参考了下面这篇文章: http://bees4honey.com/blog/tutorial/how-to-add-iad- ...
- mysql 外键关联
mysql 外键关联 什么是外键:外键是一个特殊的索引,用于关联两个表,只能是指定内容. 如我将新建一个daka的表,然后将此表的class_id 与另外一个class的表的cid字段关联 class ...