基础数论重定向

今天蒟蒻切水题切到一道建议评黄的红题,一下子给我整不会了……

题目传送门

理解题意

首先,我们要理解题意。

[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 真·基础数论问题的更多相关文章

  1. 洛谷P4778 Counting swaps 数论

    正解:数论 解题报告: 传送门! 首先考虑最终的状态是固定的,所以可以知道初始状态的每个数要去哪个地方,就可以考虑给每个数$a$连一条边,指向一个数$b$,表示$a$最后要移至$b$所在的位置 显然每 ...

  2. 洛谷P4562 [JXOI2018]游戏 数论

    正解:数论 解题报告: 传送门! 首先考虑怎么样的数可能出现在t(i)那个位置上?显然是[l,r]中所有无法被表示出来的数(就约数不在[l,r]内的数嘛QwQ 所以可以先把这些数筛出来 具体怎么筛的话 ...

  3. 洛谷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, ...

  4. 洛谷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的最大公约数. 输入输出格式 输入格式 ...

  5. 洛谷P2231 [HNOI2002]跳蚤 [数论,容斥原理]

    题目传送门 跳蚤 题目描述 Z城市居住着很多只跳蚤.在Z城市周六生活频道有一个娱乐节目.一只跳蚤将被请上一个高空钢丝的正中央.钢丝很长,可以看作是无限长.节目主持人会给该跳蚤发一张卡片.卡片上写有N+ ...

  6. 洛谷P1414 又是毕业季 [数论]

    题目传送门 又是毕业季 题目背景 “叮铃铃铃”,随着高考最后一科结考铃声的敲响,三年青春时光顿时凝固于此刻.毕业的欣喜怎敌那离别的不舍,憧憬着未来仍毋忘逝去的歌.1000多个日夜的欢笑和泪水,全凝聚在 ...

  7. 洛谷 - P1403 - 约数研究 - 数论

    https://www.luogu.org/problemnew/show/P1403 可以直接用线性筛约数个数求出来,但实际上n以内i的倍数的个数为n/i的下整,要求的其实是 $$\sum\limi ...

  8. 洛谷1387(基础二维dp)

    题目很简单,数据也很小,但是思路不妨借鉴:dp[i][j]代表以(i,j)为右下角的最长正方形边长. 类比一维里面设“以XX为结尾的最XXX(所求)”. 另外define不要乱用!尤其这种min套mi ...

  9. 洛谷P1331-搜索基础-什么是矩形?(我的方案)

    原题链接:https://www.luogu.com.cn/problem/P1331 简单来说就是给出一个由‘#’和‘.‘组成的矩阵.需要识别存在几个矩形(被完全填充的).如果有矩形相互衔接则认为出 ...

随机推荐

  1. 18.-cookies和session

    一.会话定义 从打开浏览器访问一个网站,到关闭浏览器结束此次访问,称之为一次绘画 HTTP协议是无状态的,导致绘画状态难以保持 Cookies和session就是为了保持会话状态而诞生的两个存储技术 ...

  2. 我终于会写 Java 的定时任务了!

    前言 学过定时任务,但是我忘了,忘得一干二净,害怕,一直听别人说: 你写一个定时任务就好了. 写个定时任务让他去爬取就行了. 我不会,所以现在得补回来了,欠下的终究要还的,/(ㄒoㄒ)/~~ 定时任务 ...

  3. Windows7下驱动开发与调试体系构建——3.调试体系概述

    目录/参考资料:https://www.cnblogs.com/railgunRG/p/14412321.html 调试体系概述 0.什么是自建调试体系? 就是复写windows的调试api,使得调试 ...

  4. html中可以写php代码,但是文件后缀名需要是.php而不是.html。否则php程序不会被解析执行。

    html中可以写php代码,但是文件后缀名需要是.php而不是.html.否则php程序不会被解析执行. <div class="goods_title"><?p ...

  5. Pthread 并发编程(一)——深入剖析线程基本元素和状态

    Pthread 并发编程(一)--深入剖析线程基本元素和状态 前言 在本篇文章当中讲主要给大家介绍 pthread 并发编程当中关于线程的基础概念,并且深入剖析进程的相关属性和设置,以及线程在内存当中 ...

  6. JS逆向实战2--cookie-AcwScV2加密—某招标信息网

    cookies的获取 首先拿到第一次访问原链接 拿到acw_tc的值,然后放到session中去 再用这个session再次访问原链接拿到js加载的加密的真实数据.用了一些反混淆. 最后获取这个数据中 ...

  7. Codeforces Round #805 (Div. 3)G2. Passable Paths

    题目大意: 给出一个无向无环连通图(树),n个点n-1条边,m次查询,每次询问给出一个集合,问集合里的树是否都在同一条链上(即能否不重复的走一条边而遍历整个点集) 思路:通过求lca,若有三个点x,y ...

  8. c语言内存四区、数据存储范围和内存存储方向

    (1)代码区通常是共享只读(代码无法修改)的,即可以被其他的程序调用,例如运行两个qq,除了数据不一样,代码都是一样的, 每次运行qq,都会将代码和数据加载到内存中,除了数据,每次加载的代码都是一样的 ...

  9. 【深入浅出 Yarn 架构与实现】3-3 Yarn Application Master 编写

    本篇文章继续介绍 Yarn Application 中 ApplicationMaster 部分的编写方法. 一.Application Master 编写方法 上一节讲了 Client 提交任务给 ...

  10. 硬核!Apache Hudi Schema演变深度分析与应用

    1.场景需求 在医疗场景下,涉及到的业务库有几十个,可能有上万张表要做实时入湖,其中还有某些库的表结构修改操作是通过业务人员在网页手工实现,自由度较高,导致整体上存在非常多的新增列,删除列,改列名的情 ...