首页 > 其他分享 >洛谷P8567 真·基础数论问题

洛谷P8567 真·基础数论问题

时间:2023-01-03 21:22:56浏览次数:58  
标签:P8567 le 洛谷 奇数 数论 二进制 ans lld 10

基础数论重定向

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

理解题意

首先,我们要理解题意。
[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,le,洛谷,奇数,数论,二进制,ans,lld,10
From: https://www.cnblogs.com/mornhus-xsylf-123/p/17023396.html

相关文章

  • 寒假第一次洛谷蓝桥个人赛 题解+补题(下)
    D.灵能传输##神仙结论把前缀和应用到极致,6先考虑三个数a,b,c,进行一次变换也就是a+b,-b,c+b可见三个数之和不变,也就是s[3]不变然后之前的s[1]+b,愿称之为s[2]之前的s......
  • 洛谷P8838 [传智杯 #3 决赛] 面试(害 刚开始,没想到用dfs 呜呜呜)
    这道题其实不算难,但是我没有想到用dfs,害,,难受。其次这个题,我看了大佬的代码,找到答案后直接exit(0),直接退出,而不是利用return一层层返回。其实这个题就是利用dfs求出每种......
  • 洛谷2022年十二月月赛题解(作者:Kubic)
    T1只有第一秒走的长度为奇数,后面每一秒走的长度都为偶数,因此所有除\(0\)外的偶数点都是不可达的。当\(n\)为奇数时,设\(d\)为满足\(\sum\limits_{i=1}^d2^{i-1}\g......
  • 寒假第一次洛谷蓝桥个人赛 题解+补题(上)
    传送门部分,今天整不完了A.带分数(补题)##这...话说赛时难以置信地看了好几遍题目,然后完全没思路(我以为有什么神仙结论,压根没想暴力搜索,还是被虎到了,然后就根本没管这道......
  • 洛谷 P1223 排队接水
    题目传送门:https://www.luogu.com.cn/problem/P1223题目:Description:有nn个人在一个水龙头前排队接水,假如每个人接水的时间为Ti,请编程找出这n个人排队的一种顺序,使得n......
  • 洛谷P1862输油管道问题
    题目传送门二话不说先上代码:#include<bits/stdc++.h>usingnamespacestd;intn;intx,y[10001];intmain(){ scanf("%d",&n); for(inti=1;i<=n;i++){ scanf("%......
  • 洛谷 P5721 【入门3】循环结构
    P5723【深基4.例13】质数口袋1.题目描述小A有一个质数口袋,里面可以装各个质数。他从 2 开始,依次判断各个自然数是不是质数,如果是质数就会把这个数字装入口袋。口......
  • 《初等数论及其应用》阅读笔记
    Chapter1整数良序性质(TheWell-OrderingProperty):每个非空的正整数集合都有一个最小元。定义如果存在整数\(p\)和\(q\ne0\),使得\(r=p/q\),则称实数\(r\)是有理......
  • 洛谷P4146 序列终结者 题解 splay tree
    题目链接:​​https://www.luogu.com.cn/problem/P4146​​题目大意:支持:区间更新(+x)区间翻转区间查询(最大值)解题思路:几乎和​​AcWing2437.Splay​​这题一模一样。示例程......
  • Even Subarrays(数论问题)
    题目链接题目描述:Youaregivenanintegerarray\(a_1,a_2,…,a_n(1≤a_i≤n).\)FindthenumberofsubarraysofawhoseXORhasanevennumberofdivisors.In......