Codeforces Round #554 (Div. 2) B. Neko Performs Cat Furrier Transform(思维题+log2求解二进制位数的小技巧)
题意:
给出一个数x,有两个操作:
①:x ^= 2k-1;
②:x++;
每次操作都是从①开始,紧接着是②
①②操作循环进行,问经过多少步操作后,x可以变为2p-1的格式?
最多操作40次,输出操作数和所有操作中步骤①的操作数的k;
我的思路:
操作①每次都是异或 (k-1) 个1;
我们最终的结果是将 x 变为(p-1)个1;
那么,我们只要每次异或操作都将x中最高的0位变为1;
因为x最多只有20位,所以,完全可以在40个操作内将x变为(p-1)个1;
例如:
7654321(位置)
(1001011)2
①第一步,找到最后一个0的位置6,异或(1<<6)-1
(1001011)^( 111111)=(1110100)
(1110100)+1=(1110101)
接着查找最后一个0的位置4(重复步骤①),异或(1<<4)-1
(1110101)^(1111)=(1111010)
(1111010)+1=(1111011)
接着执行步骤①②,直到满足条件 (有可能不执行x++操作)
AC代码:
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std; int x;
int a[]; int F()
{
for(int i=(int)log2(x);i >= ;--i)
if(!((<<i)&x))
return i+;
}
void Solve()
{
//need=x的二进制中0变为1对应的10进制数
//例如:x=(1010),need=(1111)
int need=pow(,(int)log2(x)+)-;
int ans=;
while(x != need)
{
int k=F();//x的k-1位置为最高位的0(从0开始)
a[++ans]=k;
x ^= (<<k)-;//将最高位的0变为1
if(x == need)
break;
ans++;
x++;
}
printf("%d\n",ans);
for(int i=;i <= ans;i+=)
printf("%d ",a[i]);
}
int main()
{
scanf("%d",&x);
Solve(); return ;
}
有关log2(x)求解x转化为二进制位数的小技巧:
这里要手动艾特我家小花猪,要不然,我还不知道,还有这操作呢QWQ;
一直以来,求解十进制数x转化为二进制数的位数我都是这么操作的:
int x;
cin>>x;
int tot=;
for(;!((<<tot)&x);tot--);
cout<<"共"<<tot+<<"位\n";
第四行for()代码,完全可以用个公式一行搞定:
tot=log2(x)+1;
来,分析一下:
假设log2(x)=y;
如果x为2的幂,假设x=2k,那么,y=k;
反之,即2k < x < 2k+1,y = k;
不管如何,x转化成二进制的位数为 k+1 位,即 log2(x)+1 位;
Codeforces Round #554 (Div. 2) B. Neko Performs Cat Furrier Transform(思维题+log2求解二进制位数的小技巧)的更多相关文章
- Codeforces Round #554 (Div. 2) 1152B. Neko Performs Cat Furrier Transform
学了这么久,来打一次CF看看自己学的怎么样吧 too young too simple 1152B. Neko Performs Cat Furrier Transform 题目链接:"ht ...
- Neko Performs Cat Furrier Transform CodeForces - 1152B 二进制思维题
Neko Performs Cat Furrier TransformCodeForces - 1152B 题目大意:给你一个x,在40步操作以内把x变成2m−1,m为非负整数.对于每步操作,奇数步可 ...
- Codeforces Round #554 (Div. 2) 1152A - Neko Finds Grapes
学了这么久,来打一次CF看看自己学的怎么样吧 too young too simple 1152A - Neko Finds Grapes 题目链接:"https://codeforces. ...
- Codeforces Round #554 (Div. 2) C. Neko does Maths (简单推导)
题目:http://codeforces.com/contest/1152/problem/C 题意:给你a,b, 你可以找任意一个k 算出a+k,b+k的最小公倍数,让最小公倍数尽量小,求出 ...
- Codeforces Round #554 (Div. 2) C.Neko does Maths (gcd的运用)
题目链接:https://codeforces.com/contest/1152/problem/C 题目大意:给定两个正整数a,b,其中(1<=a,b<=1e9),求一个正整数k(0&l ...
- Codeforces Round #554 (Div. 2) C. Neko does Maths(数学+GCD)
传送门 题意: 给出两个整数a,b: 求解使得LCM(a+k,b+k)最小的k,如果有多个k使得LCM()最小,输出最小的k: 思路: 刚开始推了好半天公式,一顿xjb乱操作: 后来,看了一下题解,看 ...
- Codeforces Round #554 (Div. 2) C. Neko does Maths (数论 GCD(a,b) = GCD(a,b-a))
传送门 •题意 给出两个正整数 a,b: 求解 k ,使得 LCM(a+k,b+k) 最小,如果有多个 k 使得 LCM() 最小,输出最小的k: •思路 时隔很久,又重新做这个题 温故果然可以知新❤ ...
- Codeforces Round #554 (Div. 2) E Neko and Flashback (欧拉路径 邻接表实现(当前弧优化..))
就是一欧拉路径 贴出邻接表欧拉路径 CODE #include <bits/stdc++.h> using namespace std; const int MAXN = 100005; ...
- Codeforces Round #554 (Div. 2) F2. Neko Rules the Catniverse (Large Version) (矩阵快速幂 状压DP)
题意 有nnn个点,每个点只能走到编号在[1,min(n+m,1)][1,min(n+m,1)][1,min(n+m,1)]范围内的点.求路径长度恰好为kkk的简单路径(一个点最多走一次)数. 1≤n ...
随机推荐
- PHP制作个人博客-广告位添加与调用 推荐文章数据调取
上一节博客的导航我们已经动态调取,这一节我们主讲一下如何根据页面布局,后台添加广告位,及模板上动态调取广告.博客推荐文章的数据调用. 首先我们在云码博客的后台添加10条左右的测试数据,thinkcmf ...
- css文字超出一行用点表示
1,css超出一行用点表示 white-space:nowrap; overflow:hidden; text-overflow:ellipsis; 2,css超出二行用点表示 overflow:hi ...
- vue中使用provide和inject刷新当前路由(页面)
1.场景 在处理列表时,常常有删除一条数据或者新增数据之后需要重新刷新当前页面的需求. 2.遇到的问题 1. 用vue-router重新路由到当前页面,页面是不进行刷新的 2.采用window.rel ...
- MIUI12系统怎么样开启Root超级权限的流程
MIUI12系统能有啥方法开启root超级权限?各位都清楚,Android机器有root超级权限,如果手机开启root相关权限,可以实现更好的功能,举例子,各位公司的营销部门,使用某些营销软件都需要在 ...
- log4net使用封装,无缝切换 dotnet 和 dotnetcore
log4net使用封装,无缝切换 dotnet 和 dotnetcore Intro 自己有几个自己的小项目,有许多公用的方法/扩展/工具类等等,于是封装了一些常用的工具类/扩展方法 WeihanLi ...
- ClickOnce一项Winform部署
先建一个Winform 控制台程序 建好后从工具箱里拖出来个 文本框 在属性中把TEXT改了 鼠标放到项目上点击右键——>属性 如下图所示,有两个发布位置. 发布位置可以选择本地文件夹,也可以选 ...
- docker-compose的安装和卸载
使用docker-compose 可以轻松.高效的管理容器,它是一个用于定义和运行多容器 docker 的应用程序工具. 原文地址:代码汇个人博客 http://www.codehui.net/inf ...
- eclipse导入maven项目,但无法编译的问题
同事今天从git 导入项目到eclipse 后,发现项目所依赖的包找不到依赖,初步判定是maven的依赖没有导入项目中. 最终发现,在项目中的.classpath 文件加入以下代码即可解决问题. &l ...
- Hybrid App—Hybrid App开发模式介绍和各种开发模式对比
什么是Hybrid App 最开的App开发只有原生开发这个概念,但自从H5广泛流行后,一种效率更高的开发模式Hybrid应运而生,它就是"Hybrid模式".Hybrid APP ...
- .NET方法无限传参数技术
是否有这样的需求在创建函数时参数个数不固定,又不想使用重载,那么下面这个技术就比较适合. 相信你一定见过下面这的代码: ); Format 就是string的一个函数,第一个参数是固定的字符串类型,那 ...