背景

太逊了,调了三次才调出来,所以写篇题解寄念。LC好睿智

题意

给你两个数 \(a,b\),现在要从 \(a\) 跑到 \(b\),每次可以将当前的 \(a\) 拆分成 \(2^n\times m(n,m\in N)\) 的形式,并将它变成 \(2^n\times (m+1)\)。问最少变几次能跑到 \(b\),输出次数和每次变化前后 \(a\) 的值。

分析

这道题有一个一眼贪心。在一次变化后不会超过 \(b\) 的情况下,我们要让 \(n\) 的值尽可能大来使得 \(a\) 变化后更大。所以我们可以写一个函数来先找到 \(n\) 最大可以是多少,具体就是看看 \(a\) 的因数中最大的 \(2\) 的整次幂是多少,下面给出:

int p(int x)
{
int ans=1;
while(x%ans==0)
{
ans=ans<<1;
}
if(x%ans)ans/=2;
return ans;
}

然后计算出 \(m\),并判断这样拆分后一次变化是否会超过 \(b\),如果超过就让 \(n>>1\),直到满足条件。因为要先输出变化次数,所以用两个数组记录每次变化前后 \(a\) 的值即可。

细节

如果 \(a\) 的初值为 \(0\),我们发现此时 \(n\) 可以是任意值,所以我们特判一下,直接找到不大于 \(b\) 的最大的 \(2\) 的整次幂,让 \(a\) 变成它就行了。

Code

#include<bits/stdc++.h>
#define int long long
using namespace std;
inline int read()
{
int w=1,s=0;char ch=getchar();
while(!isdigit(ch)){if(ch=='-') w=-1;ch=getchar();}
while(isdigit(ch)){s=s*10+(ch-'0');ch=getchar();}
return w*s;
}
const int maxn=6e7+10;
int l,r;
int p(int x)//得出最大因数
{
int ans=1;
while(x%ans==0)
{
ans=ans<<1;
}
if(x%ans)ans/=2;
return ans;
}
int lo(int x)//得出最大2的整次幂
{
int i;
for(i=1;i<=x;i*=2);
if(i>x)i/=2;
return i;
}
int ansl[maxn],ansr[maxn],tot;//记录答案
signed main()
{
// freopen("test.in","r",stdin);
// freopen("test.out","w",stdout);
cin>>l>>r;
while(l<r)
{
if(l==r)break;
ansl[++tot]=l;
if(l==0)//特判
{
int pr=lo(r);
l=pr;
ansr[tot]=l;
continue;
}
int p2=p(l);
int bei=l/p2;//计算n和m
while(p2*(bei+1)>r)//向下缩小n
{
p2=p2>>1;
bei=l/p2;
}
l=p2*(bei+1);
ansr[tot]=l;
}
cout<<tot<<endl;
for(int i=1;i<=tot;i++)
cout<<ansl[i]<<' '<<ansr[i]<<endl;
return 0;
}

Divide Interval 题解的更多相关文章

  1. 算法与数据结构基础 - 排序(Sort)

    排序基础 排序方法分两大类,一类是比较排序,快速排序(Quick Sort).归并排序(Merge Sort).插入排序(Insertion Sort).选择排序(Selection Sort).希尔 ...

  2. 【题解】The Great Divide [Uva10256]

    [题解]The Great Divide [Uva10256] 传送门:\(\text{The Great Divide [Uva10256]}\) [题目描述] 输入多组数据,每组数据给定 \(n\ ...

  3. [LeetCode]题解(python):057-Insert Interval

    题目来源 https://leetcode.com/problems/insert-interval/ Given a set of non-overlapping intervals, insert ...

  4. 【题解】【区间】【二分查找】【Leetcode】Insert Interval & Merge Intervals

    Given a set of non-overlapping intervals, insert a new interval into the intervals (merge if necessa ...

  5. Codeforces 311D Interval Cubing 数学 + 线段树 (看题解)

    Interval Cubing 这种数学题谁顶得住啊. 因为 (3 ^ 48) % (mod - 1)为 1 , 所以48个一个循环节, 用线段树直接维护. #include<bits/stdc ...

  6. 题解-CF1401E Divide Square

    题面 CF1401E Divide Square 给一个正方形平面边长为 \(10^6\),给 \(n\) 条横线段和 \(m\) 条竖线段,每条线段都与正方形边缘相交且一条直线上不会有两条线段,求被 ...

  7. UVA10375 选择与除法 Choose and divide 题解

    题目链接: https://www.luogu.org/problemnew/show/UVA10375 分析: 这道题可以用唯一分解定理来做. 什么是唯一分解定理?百度即可,这里也简介一下. 对于任 ...

  8. CH 4302 Interval GCD 题解

    题意 给定一个长度为N的数列A,以及M条指令 (N≤5* 10^5, M<=10^5),每条指令可能是以下两种之一: "C l r d",表示把 A[l],A[l+1],-, ...

  9. 【CF1445D】Divide and Sum 题解

    题目链接 题意简介 将一个长度为 2n 的数列平均分为两个子数列 p 和 q 后,p 按从小到大排序,q 按从大到小排序. 排序后,记 p 为 \(\{x_i\}\) ,q 为 \(\{y_i\}\) ...

  10. LeetCode OJ 题解

    博客搬至blog.csgrandeur.com,cnblogs不再更新. 新的题解会更新在新博客:http://blog.csgrandeur.com/2014/01/15/LeetCode-OJ-S ...

随机推荐

  1. git cherry-pick合并其它分支的某次提交(commits)到当前分支

    git cherry-pick 可以选择某一个分支中的一个或几个commit(s)来进行操作. 例如,假设我们有个稳定版本的分支,叫v2.0.0,另外还有个开发版本的分支v3.0.0,我们不能直接把两 ...

  2. Vue cli之单文件组件

    组件有两种:脚本化组件.单文件组件 脚本化组件的缺点: html代码是作为js的字符串进行编写,所以组装和开发的时候不易理解,而且没有高亮效果. 脚本化组件用在小项目中非常合适,但是复杂的大项目中,如 ...

  3. Flutter(一):MAC的Flutter安装指南

    官网地址 官网: https://flutter.dev Github: https://github.com/flutter/flutter Git的核心分支包括master.dev.stable. ...

  4. JS中BOM事件,JS样式特效,表格对象和表单操作

    DOM事件 1.DOM中的事件可以分为两类 1.浏览器行为 如:文档加载完成,图片加载完成 2.用户行为 如:输入框输入数据,点击按钮 (2).常见的DOM事件 onload 浏览器已完成页面的加载 ...

  5. itest(爱测试) 4.5.5 发布,开源BUG 跟踪管理 & 敏捷测试管理&极简项目管理软件

    itest 简介 itest 开源敏捷测试管理,testOps 践行者,极简的任务管理,测试管理,缺陷管理,测试环境管理4合1,又有丰富的统计分析.可按测试包分配测试用例执行,也可建测试迭代(含任务, ...

  6. LeetCode 451. Sort Characters By Frequency 根据字符出现频率排序 (C++/Java)

    题目: Given a string, sort it in decreasing order based on the frequency of characters. Example 1: Inp ...

  7. 开源高性能结构化日志模块NanoLog

      最近在写数据库程序,需要一个高性能的结构化日志记录组件,简单研究了一下Microsoft.Extensions.Logging和Serilog,还是决定重造一个轮子. 一.使用方法   直接参考以 ...

  8. babel 基础概念 & 从零到一写一个 babel 插件

    babel 基础概念 简单来说,做语法转换兼容的, 复杂一点的说,babel可以将我们写的 ES6+ 的Javascript语法转换为向后兼容的语法,以便能够在旧版本的浏览器或者其他环境运行. bab ...

  9. 燕千云助力ITSM知识沉淀与复用

    数字化时代IT服务知识沉淀痛点 随着企业数字化进程的推进,企业需要购入更多的智能化.数字化设备及软件,高效生产的同时,问题也层出不穷.而IT服务管理,可以为企业减少密集型的资源消耗,帮助企业以更高效. ...

  10. MyBatis的逆向工程详细步骤操作

    1. MyBatis的逆向工程详细步骤操作 @ 目录 1. MyBatis的逆向工程详细步骤操作 2. 逆向工程配置与生成 2.1 MyBatis3Simple:基础版,只有基本的增删改查 2.1.1 ...