首页 > 其他分享 >P9451 [ZSHOI-R1] 新概念报数 题解

P9451 [ZSHOI-R1] 新概念报数 题解

时间:2023-07-17 11:45:10浏览次数:43  
标签:cnt R1 int 题解 ll texttt popcount num ZSHOI

目录

Description

在此题中,对于一个数 \(x\),若 \(\texttt{popcount}(x)\geq3\)(即 \(x\) 在二进制下 \(\texttt{1}\) 的个数大于等于三时),那它是非法的,否则其为合法的。

给定 \(T\) 个数,如果当前的数 \(x\) 是非法的,则输出 No,Commander,否则输出第一个大于 \(x\) 的合法的数。

Solution

对于一个数 \(x\),我们可以快速得出 \(\texttt{popcount}(x)\),若为非法,直接输出答案,否则还剩三种情况:

  1. \(\texttt{popcount}(x)=0\),说明 \(x=0\),输出 \(\texttt{1}\) 即可。
  2. \(\texttt{popcount}(x)=1\),输出 \(x+1\) 即可,因为 \(\texttt{popcount}(x+1)=2\)(\(\texttt{popcount}(1+1)=1\) 为特例)
  3. \(\texttt{popcount}(x)=2\),设答案为 \(y\),若 \(\texttt{popcount}(y)=1\) ,则 \(y=2^{\left\lceil\log_2{x}\right\rceil+1}\),比如 \(x=\texttt{10100}\) 时 \(y=100000\),而 \(\texttt{popcount}(y)=2\) 时,则需要找到其从低到高第一个 \(1\) 的位置 \(k\),\(y=x+2^{k-1}\),因为在把第 \(k\) 位的 \(\texttt{1}\) 消掉时,能同时加 \(\texttt{1}\) 到 \(k+1\) 位上,如 \(x=10100\) 时 \(y=11000\),要比第一种更小,综上,输出 \(x+2^{k-1}\) 即可。

Code

#include<bits/stdc++.h>
using namespace std;
#define ll long long
int t;
int check(ll num){  // 得出popcount(x)
	int cnt=0;
	while(num){
		if(num&1){
			cnt++;
		}
		num>>=1;
	}
	return cnt;
}
ll next(ll x){ //记得开 long long
	if(check(x)==1||check(x)==0) return x+1;
	int cnt=0;
	ll y=x;
	while(x){
		if(x&1) break; //找到 k
		x/=2;
		cnt++;
	}
	ll xx=pow(2,cnt); // 加上 2^{k-1}
	return (ll)(y+xx);
}
int main(){
	cin>>t;
	while(t--){
		ll x;
		cin>>x;
		if(check(x)>=3) cout<<"No,Commander"<<endl;
		else cout<<next(x)<<endl;
	}
	return 0;
}

标签:cnt,R1,int,题解,ll,texttt,popcount,num,ZSHOI
From: https://www.cnblogs.com/larryyu/p/17559627.html

相关文章

  • requests.exceptions.ProxyError问题解决方法
    出现这个问题是因为你系统上在使用代理,然后你的代理又是规则匹配的。https://stackoverflow.com/questions/36906985/switch-off-proxy-in-requests-library3种解决方法:headers={"User-Agent":"Mozilla/5.0(WindowsNT10.0;Win64;x64;rv:109.0)Gecko/20100101Fi......
  • CF512D Fox And Travelling 题解--zhengjun
    计数好题。首先对于每个连通块独立考虑,最后合并答案。发现点数超过1的强连通分量一定删不掉。若连通块中存在点数超过1的强连通分量tarjan缩点之后,称这些点数超过1的强连通分量为关键点;那么两关键点之间的点也不能删;于是对于剩下的点直接dp即可,由于可删的子树......
  • 你省(福建)省队集训模拟赛题解
    Day5$\texttt{T1}$简要题意有两个正整数\(a<b\le10^9\),给出\(\dfrac{a}{b}\)的小数点后\(19\)位,要求还原\(a,b\),保证有解。solution一个科技:\(\texttt{Stern-Brocottree}(SBT)\),可以参考这个博客学习。先给出$O(n)$找的代码#include<bits/stdc++.h>#defineLL......
  • 洛谷-P9455 题解
    写在前面:本题蒟蒻给出两种做法,一种乱搞贪心(只是目前能过,若能被Hack请和我说),一种正解二分。正文1最坏时间复杂度:\(\mathcal{O}(n+\logV)(V=10^9)\)这个做法是很简单的,在此不多讲。只需要二分超频电压mid即可,若当前mid可行,则令右边界缩小至mid,否则令左边界扩大至mid。......
  • 230226题解
    A数列题目描述给定一个长为\(n\)的数列\(A_1,A_2,…,A_n\)。给出\(q\)次询问,每次询问给定\(X\),请你回答至少需要多少次操作,能够让数列中的每个数都变成\(X\)。每次操作你可以选择数列中的一个数加\(1\)或者减\(1\)。询问之间相互独立。输入格式第一行两个整数\(n,q\)。第......
  • 题解 HDU5726【GCD】/ LGT353762【Soso 的最大公约数】
    Problem给你一个长为\(N(1\leqN\leq1\times10^5)\)的整数序列:\(a_{1},\cdots,a_{n}(0<a_{i}\leq1\times10^9)\)。有\(Q(1\leqQ\leq1\times10^5)\)次提问。每次提问有个范围\(l,r\),你需要计算出\(\gcd(a_{l},,a_{l+1},...,a_{r})\),并且统计数对\((l’,r’......
  • Codeforces Round 896 Div2 A-D题解
    CodeforcesRound896A.Politics这题问的是,给一些人的在n个议题的观点,然后你可以随意安排顺序,每个议题人多的赢,反对派会离开,问随便安排议题,最多留下多少人,包括我自己这个题刚开始愣了半天,但是想到,那只要把所有和我观点一致的给留下来不就行了???然后交上去就AC了ACCode#inclu......
  • 题解 CF1842H【Tenzing and Random Real Numbers】
    看了题解。好难受,想用积分求概率,算了半天。发现没啥规律,不是不能算,就是太可怕了。Problem有\(n\)个\([0,1]\)范围内的均匀随机变量\(x_{1\cdotsn}\)和\(m\)条限制,每条限制形如\(x_i+x_j\le1\)或\(x_i+x_j\ge1\)。请你求出所有限制均满足的概率。对\(998244353\)......
  • Noip优质模拟赛口胡题解
    HDU5719题意概括:第一行输入t表示输入数据,每组数据第一行n,表示对1—n进行排序。接下来输入n个数b[n]表示排列中第i个数之前的最小值为b[i]。第三行n个数c[n],表示排列中第i个数之前的最大值为c[i]。解题思路:递推,排除掉6种不可能的情况,1、b[i]>b[i-1]2、c[i]<c[i-1]3、b[i]......
  • 2023.07.16 高质量 NOIP 模拟赛题解
    HDU5719Arrange【模拟】给定数列\(B_n,C_n\),求出满足\[B_i=\min_{j=1}^i\{A_j\},\quadC_i=\max_{j=1}^i\{A_j\}\]的排列\(A\)的数量。维护每个位置可能的数字数量,然后乘法原理即可。代码:http://acm.hdu.edu.cn/viewcode.php?rid=38654445。HDU5807KeepInTouch......