洛谷P8567 真·基础数论问题
基础数论重定向
今天蒟蒻切水题切到一道建议评黄的红题,一下子给我整不会了……
题目传送门
理解题意
首先,我们要理解题意。
[JRKSJ R6] Nothing
我们定义 \(f(x)\) 表示 \(x\) 在 \(2\) 进制下最低的 \(1\) 的位置(你需要注意,二进制下的最低位是第 $0 $ 位)。以下是其在 C++
语言中的代码(未考虑数据类型造成的问题):
int f(int x){
int ans = 0;
while (x % 2 == 0){
x /= 2;
ans += 1;
}
return ans;
}
共有 \(T\) 组询问,每组询问给定区间 \([l,r]\),求有多少个 \(i\in [l,r]\) 使得 \(f(i)< f(i+1)\)。
打眼一看这啥呀?让我给你翻译翻译什么叫¥#@惊喜……
这题的意思就是:定义\(f(x)=(n)max\) 使得 \(x \ mod \ 2^n==0\)
继续翻译:\(f(x)\)指的是数\(x\)的二进制的从右往左数的第一个\(1\)前面的\(0\)的个数。
还是不懂?我们来一套数据帮助理解:
我们这里有一个数:\(114514\)
我们将这个数转化成二进制:
\(11011111101010010\)
可以看到这个数的\(f(x)\)指的是数\(x\)的二进制的从右往左数的第一个\(1\)前面的\(0\)的个数是1。
而整道题的意思就是给定区间\([l,r]\)要求出在这个区间符合\(f(x) < f(x+1)\)的\(x\)的个数。
思路
我们先看看数据规模哈:
数据规模
本题采用捆绑测试。
\(\text{Subtask}\) | \(T\le\) | 特殊限制 | \(\text{Score}\) |
---|---|---|---|
\(1\) | \(10^5\) | \(l=r\) | \(10\) |
\(2\) | \(10^4\) | \(r-l\le10^3\) | \(30\) |
\(3\) | \(10^5\) | \(r\le10^6\) | \(20\) |
\(4\) | \(10^5\) | 无 | \(40\) |
对于 \(100\%\) 的数据,\(1\le T\le 10^5\),\(1\le l\le r\le 10^{18}\)。
首先考虑一下,既然玩的是二进制,那我们敏锐的认为与奇偶性有关。
我们仔细研究后得出以下几条性质:
- 奇数后面一定是偶数,偶数后面一定是奇数(废话……)
- 对于任意偶数\(x\),不满足\(f(x) < f(x+1)\)
- 对于任意奇数\(x\),满足\(f(x) < f(x+1)\)
我们来看下怎么出来的:
首先奇数的二进制最右边一定是1,因为它无法被2整除。
然后偶数的二进制最右边一定是0,因为它能被2整除。
如果实在理解不了我们打一个奇偶数表来看看:
数字 | 二进制 |
---|---|
\(1\) | \(1\) |
\(2\) | \(10\) |
\(3\) | \(11\) |
\(4\) | \(100\) |
\(5\) | \(101\) |
\(6\) | \(110\) |
\(7\) | \(111\) |
\(8\) | \(1000\) |
\(9\) | \(1001\) |
\(10\) | \(1010\) |
就能发现奇数末尾是1,偶数末尾是0。
这几个性质你可以细品品,就能发现,哇!
这道题我们已经 \(O(1)\)解决了!
怎么解决的?
对于一个区间\([l,r]\),我们找到其中奇数的个数就行了!。
怎么找呢?
代码T_T
请看代码:
#include<bits/stdc++.h>
using namespace std;
long long l,r,ans;
int main(){
int t;
scanf("%d",&t);
while(t--){
scanf("%lld %lld",&l,&r);
if(l==r){
printf("%lld\n",l%2);
}else{
ans=0;
if(l%2){
ans++;
l++;
}
if(r%2){
ans++;
r--;
}
if(l>r){
printf("%lld\n",ans);
}else{
printf("%lld\n",(r-l)/2+ans);
}
}
}
return 0;
}
思路大致是这样:
- 如果l==r,那么直接输出l是否为奇数。
- 如果不相等
- 如果l为奇数,l+1,ans+1
- 如果r为奇数,r-1,ans+1
- 此时l,r一定都为偶数。
- 若l超过r直接输出ans
- 若没有,ans+(r-l)/2便是答案,这个自己推一下就好
完结撒花
洛谷P8567 真·基础数论问题的更多相关文章
- 洛谷P4778 Counting swaps 数论
正解:数论 解题报告: 传送门! 首先考虑最终的状态是固定的,所以可以知道初始状态的每个数要去哪个地方,就可以考虑给每个数$a$连一条边,指向一个数$b$,表示$a$最后要移至$b$所在的位置 显然每 ...
- 洛谷P4562 [JXOI2018]游戏 数论
正解:数论 解题报告: 传送门! 首先考虑怎么样的数可能出现在t(i)那个位置上?显然是[l,r]中所有无法被表示出来的数(就约数不在[l,r]内的数嘛QwQ 所以可以先把这些数筛出来 具体怎么筛的话 ...
- 洛谷P1134 阶乘问题[数论]
题目描述 也许你早就知道阶乘的含义,N阶乘是由1到N相乘而产生,如: 12! = 1 x 2 x 3 x 4 x 5 x 6 x 7 x 8 x 9 x 10 x 11 x 12 = 479,001, ...
- 洛谷P2398 GCD SUM [数论,欧拉筛]
题目传送门 GCD SUM 题目描述 for i=1 to n for j=1 to n sum+=gcd(i,j) 给出n求sum. gcd(x,y)表示x,y的最大公约数. 输入输出格式 输入格式 ...
- 洛谷P2231 [HNOI2002]跳蚤 [数论,容斥原理]
题目传送门 跳蚤 题目描述 Z城市居住着很多只跳蚤.在Z城市周六生活频道有一个娱乐节目.一只跳蚤将被请上一个高空钢丝的正中央.钢丝很长,可以看作是无限长.节目主持人会给该跳蚤发一张卡片.卡片上写有N+ ...
- 洛谷P1414 又是毕业季 [数论]
题目传送门 又是毕业季 题目背景 “叮铃铃铃”,随着高考最后一科结考铃声的敲响,三年青春时光顿时凝固于此刻.毕业的欣喜怎敌那离别的不舍,憧憬着未来仍毋忘逝去的歌.1000多个日夜的欢笑和泪水,全凝聚在 ...
- 洛谷 - P1403 - 约数研究 - 数论
https://www.luogu.org/problemnew/show/P1403 可以直接用线性筛约数个数求出来,但实际上n以内i的倍数的个数为n/i的下整,要求的其实是 $$\sum\limi ...
- 洛谷1387(基础二维dp)
题目很简单,数据也很小,但是思路不妨借鉴:dp[i][j]代表以(i,j)为右下角的最长正方形边长. 类比一维里面设“以XX为结尾的最XXX(所求)”. 另外define不要乱用!尤其这种min套mi ...
- 洛谷P1331-搜索基础-什么是矩形?(我的方案)
原题链接:https://www.luogu.com.cn/problem/P1331 简单来说就是给出一个由‘#’和‘.‘组成的矩阵.需要识别存在几个矩形(被完全填充的).如果有矩形相互衔接则认为出 ...
随机推荐
- Vue中、参数传递以及重定向
1.参数传递 关键部分代码 1.参数传递 <router-link :to="{name:'information',params:{id:1}}">用户信息</ ...
- GlusterFS常用维护操作命令
GlusterFS常用维护操作命令 1.启动/关闭/查看glusterd服务 # /etc/init.d/glusterd start # /etc/init.d/glusterd stop # /e ...
- 如何使用ffmpeg缩小视频的大小?
如何使用ffmpeg缩小视频的大小? 看到这个答案.为方便起见,在下面引用: 通过将1 GB除以以秒为单位的视频长度来计算所需的比特率.因此,对于长度为16:40(1000秒)的视频,请使用10000 ...
- python中while循环
# 1. print('1.我在学python 输出5遍') print('我在学python'*5) print('我在学python\n'*5) # 只能做单一重复 不能做线性 # 2.while ...
- HTML5和CSS3新特性
1.HTML5新标签和属性 1.1 兼容性前缀与语义化 兼容低版本的写法.比较新的浏览器,可以直接写.兼容性前缀,是每个浏览器私有的. 内核 兼容性前缀 浏览器 Gecko -moz- Firefox ...
- Perl读取Excel中的数据
#!usr/bin/perl -W use strict; use Spreadsheet::ParseExcel;#PERL的Spreadsheet::ParseExcel模块支持Excel的读操作 ...
- 钉钉dingtalk=6.3.5版本RCE复现
看到网上公开了钉钉RCE的利用方式,第一时间来复现一下. 钉钉dingtalk=6.3.5版本RCE复现 免责声明: 影响版本: 漏洞POC: 漏洞复现: 存在漏洞版本下载地址: 免责声明: 本文章仅 ...
- 修复 docker build 错误 "ERROR: No build stage in current context"
若 docker build 时遇到了错误 "ERROR: No build stage in current context",则有可能是没有将 FROM 命令语句放置在第一行. ...
- 操作系统课程设计pintos project1实验摘记
第一部分 项目概述 一.Pintos简介 Pintos是一个基于80x86架构的简单操作系统框架,它支持内核级线程.能够加载和运行用户程序,也拥有文件系统,不过,这些功能均以一种简单的形式实现. 二. ...
- shell文件报错syntax error near unexpected token '$'\r''
本来跑的好好得一个文件,在windows下修改了,然后移植到linux就报错了. 找了一圈以下是解决方案: 这种情况发生的原因是因为你所处理的文件换行符是dos格式的"\r\n" ...