传送门

题意:

  给出一个数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求解二进制位数的小技巧)的更多相关文章

  1. Codeforces Round #554 (Div. 2) 1152B. Neko Performs Cat Furrier Transform

    学了这么久,来打一次CF看看自己学的怎么样吧 too young too simple 1152B. Neko Performs Cat Furrier Transform 题目链接:"ht ...

  2. Neko Performs Cat Furrier Transform CodeForces - 1152B 二进制思维题

    Neko Performs Cat Furrier TransformCodeForces - 1152B 题目大意:给你一个x,在40步操作以内把x变成2m−1,m为非负整数.对于每步操作,奇数步可 ...

  3. Codeforces Round #554 (Div. 2) 1152A - Neko Finds Grapes

    学了这么久,来打一次CF看看自己学的怎么样吧 too young too simple 1152A - Neko Finds Grapes 题目链接:"https://codeforces. ...

  4. Codeforces Round #554 (Div. 2) C. Neko does Maths (简单推导)

    题目:http://codeforces.com/contest/1152/problem/C 题意:给你a,b, 你可以找任意一个k     算出a+k,b+k的最小公倍数,让最小公倍数尽量小,求出 ...

  5. 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 ...

  6. Codeforces Round #554 (Div. 2) C. Neko does Maths(数学+GCD)

    传送门 题意: 给出两个整数a,b: 求解使得LCM(a+k,b+k)最小的k,如果有多个k使得LCM()最小,输出最小的k: 思路: 刚开始推了好半天公式,一顿xjb乱操作: 后来,看了一下题解,看 ...

  7. 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: •思路 时隔很久,又重新做这个题 温故果然可以知新❤ ...

  8. Codeforces Round #554 (Div. 2) E Neko and Flashback (欧拉路径 邻接表实现(当前弧优化..))

    就是一欧拉路径 贴出邻接表欧拉路径 CODE #include <bits/stdc++.h> using namespace std; const int MAXN = 100005; ...

  9. 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 ...

随机推荐

  1. Python数据处理与计算——概述

    Python是一种面向对象的,动态的程序设计语言,具有非常简洁而清晰的语法,适合于完成各种高层任务.它既可以用来快速开发程序脚本,也可以用来开发大规模的软件. 随着NumPy.SciPy.Matplo ...

  2. 关于写作那些事之利用 js 统计各大博客阅读量

    在日常文章数据统计的过程中,纯手动方式已经难以应付,于是乎,逐步开始了程序介入方式进行统计. 在上一节中,探索利用 csv 文件格式进行文章数据统计,本来以为能够应付一阵子,没想到仅仅一天我就放弃了. ...

  3. C++设计模式视频讲解

    设计模式(C++) 视频网址: http://www.qghkt.com/ 设计模式(C++)视频地址: https://ke.qq.com/course/318637?tuin=a508ea62 目 ...

  4. lua_local变量在new时不会被清空

    前言 我的运行环境 Lua5.3 按照我们以往的Java或C#编程经验,如果一个class被new,那么这个class中所有成员变量的值都是默值或是构造函数中赋的值,但在Lua中的local变量却并不 ...

  5. mysql解压包安装教程

    1.下载压缩包,地址1(官网下载):https://www.mysql.com/downloads/   地址2(百度网盘):https://pan.baidu.com/s/12lnpcr3thBe9 ...

  6. Java基础系列--01_基础类型

    J2SE.J2ME.J2EE分别指什么? J2SE 基础版,桌面应用. J2ME 微型版,手机开发.(android,ios) J2EE 企业版,所有浏览器访问的应用程序. 注意:JDK5以后改名 J ...

  7. 下载带有kali linux系统的VMware如何打开虚拟机?

    下载带有kali linux系统的VMware如何打开虚拟机? 一.安装VMware 温馨提示:如果你对虚拟机一无所知的话,最好不要自己下载kali linux系统的ISO镜像和VMware虚拟机,然 ...

  8. fullcalendar日历插件的使用并动态增删改查

    我上个项目是做了一个关于教育方面的web端页面,其中的课程表就要用到fullcalendar日历插件,刚开始也是不会用,因为以前也没用过,后面也是看官方文档,问同事,最后完成了这个课程表,个人感觉fu ...

  9. promise async await使用

    1.Promise (名字含义:promise为承诺,表示其他手段无法改变) Promise 对象代表一个异步操作,其不受外界影响,有三种状态: Pending(进行中.未完成的) Resolved( ...

  10. Apache No installed service named "Apache2.4"的解决办法

    windows安装Apache后,用cmd开启apache服务时,提示No installed service named "Apache2.4" 解决步骤: 1.cmd窗口,进入 ...