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 ...
随机推荐
- netstat -an查看到大量的TIME_WAIT状态的解决办法
netstat下time_wait状态的tcp连接: 1.这是一种处于连接完全关闭状态前的状态: 2.通常要等上4分钟(windows server)的时间才能完全关闭: 3.这种状态下的tcp连接占 ...
- js 计算金额是否小于总金额,大于是不能保存
计算金额是否小于总金额,大于是不能保存 function kpjejs(oInput){ var result = 0; var vresult = "kpsq_kpzje";// ...
- windows笔记本触摸板的快捷键教程
自从习惯了macbook的触摸板,根本就懒得使用鼠标.即实用,又便捷.但切换到windows笔记本的时候,总是不习惯使用触摸板. 今天查了一下微软的教程,发现windows现的已经做的相当不错了.但是 ...
- C#语言中的修饰符
public:公有访问.不受任何限制. private:私有访问.只限于本类成员访问,子类和实例都不能访问. protected:保护访问.只限于本类和子类访问,实例不能访问. internal:内部 ...
- Python递归函数
参考: https://pythonspot.com/recursion/ https://www.python-course.eu/recursive_functions.php 一.递归函数两大要 ...
- centos修改默认启动级别
Linux分为7个启动级别: 0 - 系统停机状态 1 - 单用户工作状态 2 - 多用户状态(没有NFS) 3 - 多用户状态(有NFS) 4 - 系统未使用,留给用户 5 - 图形界面 6 - 系 ...
- 使用docker安装mysql和redis
本文介绍在linux下使用docker安装mysql和redis. 原文地址:代码汇个人博客 http://www.codehui.net/info/59.html 测试环境:centos7.6,do ...
- 浅析C#中new、override、virtual关键字的区别
Virtual : virtual 关键字用于修饰方法.属性.索引器或事件声明,并使它们可以在派生类中被重写. 默认情况下,方法是非虚拟的.不能重写非虚方法. virtual 修饰符不能与 stati ...
- docker容器安装vi (一般容器都是Debian GNU/Linux 9)
在使用docker容器时,同时你docker里的系统正好是debian或ubuntu的时候,有时候里边没有安装vim,敲vim命令时提示说:vim: command not found,这个时候就需要 ...
- Linux 系统假死的解决方案
Linux 系统有时因为软件不兼容或未知 bug,导致系统假死.比如我的 Ubuntu 14.04 最近使用 vscode 时偶尔会导致系统假死,即鼠标可以移动,但点击无反应. 此时可试试如下解决方案 ...