当前位置: 首页 > wzjs >正文

合肥网站开发巨量数据官网

合肥网站开发,巨量数据官网,新主题 老版本 wordpress,西安企业网站怎么建立2025第16届蓝桥杯省赛之研究生组F题01串求解 一、题目概述二、解题思路2.1题目分析2.2解题思路 三、求解代码3.1求解步骤3.1.1求解x所在的二进制位数区间3.1.2求解总位数为cnt的含1数3.1.3求解cnt1~x之间的含1数 3.2完整代码3.3代码验证 四、小结 一、题目概述 给定一个由0,1,…

2025第16届蓝桥杯省赛之研究生组F题01串求解

  • 一、题目概述
  • 二、解题思路
    • 2.1题目分析
    • 2.2解题思路
  • 三、求解代码
    • 3.1求解步骤
      • 3.1.1求解x所在的二进制位数区间
      • 3.1.2求解总位数为cnt的含1数
      • 3.1.3求解cnt+1~x之间的含1数
    • 3.2完整代码
    • 3.3代码验证
  • 四、小结

一、题目概述

给定一个由0,1,2,3··· 的二进制表示拼接而成的长度无限的 01 串。其前若干位形如011011100101110111··· 。
请求出这个串的前x位里有多少个1。

输入格式:
输入的第一行包含一个正整数 x。

输出格式:
输出一行包含一个整数表示答案。

输入输出样例:
输入7,输出5。给定的串的前 7 位为 0110111。

评测用例规模与约定:
对于 60%的评测用例,x≤1e6;
对于所有评测用例,1≤x≤1e18。

洛谷已放出该题,链接为:P12191 [蓝桥杯 2025 省研究生组] 01 串,截至发文蓝桥杯官方题库还未放出该题。

二、解题思路

2.1题目分析

对于60%的用例是10的6次方数量级,可以进行遍历,拿到60%的分数,但是对于最大10的18次方数量级,则需要寻找一定的规律进行解题。

此外要注意题目输入的x为总的二进制位数,而不是最大的整数

2.2解题思路

解题思路如下:

  1. 总结位数规律。首先以整数转换为二进制数后的位数为划分依据,求出x所在的区间。可以观察出2位二进制数的整数范围为2 ~ 3,数量为2的1次方个,3位二进制数的整数范围为4~7,数量为2的2次方个,因此可以求出x所在的位数区间。
  2. 总结含1规律。2位二进制数包含的整数为2、3,含1数量为1、2;3位二进制数的整数为4、5、6、7,含1数量为1、2、2、3,依次类推可得出n位二进制数总的含1数量=n-1位二进制数总的含1数量*2+n-1位二进制数的个数。此处可以在excel或纸上进行验算。
  3. 根据上述两条规律,可以编写代码解题,不过仍有一些细节需要考虑,详细见下方代码。

三、求解代码

3.1求解步骤

3.1.1求解x所在的二进制位数区间

使用数组a存储二进制位数为i时的位数和,设置a[1]=2, i≥2时,a[i]=i*(1LL<<(i-1)),LL为定义的long long类型别名,累加a[i]就可判断出x所处的二进制位数区间。代码如下:

LL n=1;
LL cnt=0;
a[1]=2;
cnt+=a[1];
for(LL i=2; i<=64; i++)
{a[i]=i*(1LL<<(i-1));cnt+=a[i];if(cnt>x){n=i;cnt-=a[i];break;}
}

n为x所处的二进制位数,cnt为二进制位数=1~n-1的所有数的位数和。代码中i的上限为64,可以验证当x≤10的18次方时,i≤55。

3.1.2求解总位数为cnt的含1数

求解总位数为cnt的含1数即为求解二进制位数=1 ~ n-1的所有数的含1数。使用数组b存储二进制位数为i时的含1数,设置b[1]=1,b[2]=3,则当i≥3时,有b[i]=2*b[i-1]+(1LL<<(i-2))。先对数组b赋值,然后根据上一步求出的n求解1~n-1的二进制位数的含1数。代码如下:

b[1]=1;
b[2]=3;
for(LL i=3; i<=55; i++)
{b[i]=2*b[i-1]+(1LL<<(i-2));
}
ans+=b[1];
for(LL i=2; i<=n-1; i++)
{ans+=b[i];
}

代码中ans为最终输出值。

3.1.3求解cnt+1~x之间的含1数

x所处的区间的二进制位数=n,那么x一定是某个n位数的某一位,cnt+1~x之间存在若干个n位数。因此这一步骤分为两步,第一步是求出存在多少个n位数,这些n位数之间含有多少个1,第二步是求出x所在的n位数的大小,判断这个数截至x位含有多少个1。

第一步代码如下:

LL x1=x-cnt;
LL n1=x1/n;
if(n1>0)
{LL n2=log2(n1);ans+=b[n2+1];LL n3=n1-(1LL<<n2);LL tmp;while(n3){ans+=n3;tmp=log2(n3);ans+=b[tmp+1];n3=n3-(1LL<<tmp);}
}

x1即为cnt+1~x之间的位数,x1/n即为存在多少个n位数。接下来的代码较为关键

  1. 按照之前总结的规律可知,n位数含1的数量都是从1开始,1、2、2、3、2、3、3、4,遇到2的幂则在前一组的基础上顺序加1,依次循环,因此求解过程可以递归逆序求解;
  2. 设x1/n=7,则这7个数的含1数量依次为1、2、2、3、2、3、3,读者可以此为例,参照代码进行理解。

第二步的代码如下:

LL t=(1LL<<(n-1))+n1;
LL pn=n-1, qn=x1-n1*n;
while(pn&&qn)
{if(t&(1LL<<pn)){ans++;}pn--;qn--;
}

t即为x所在的n位数的大小,然后逐位判断是否含1即可

3.2完整代码

完整代码如下:

#include<bits/stdc++.h>
#define LL long long
using namespace std;LL a[64], b[64];
LL x;
LL ans;int main()
{cin>>x;if(x<=2){if(x==1) cout<<0<<'\n';else cout<<1<<'\n';return 0;}LL n=1;LL cnt=0;a[1]=2;cnt+=a[1];for(LL i=2; i<=64; i++){a[i]=i*(1LL<<(i-1));cnt+=a[i];if(cnt>x){n=i;cnt-=a[i];break;}}b[1]=1;b[2]=3;for(LL i=3; i<=55; i++){b[i]=2*b[i-1]+(1LL<<(i-2));}ans+=b[1];for(LL i=2; i<=n-1; i++){ans+=b[i];}LL x1=x-cnt;LL n1=x1/n;if(n1>0){LL n2=log2(n1);ans+=b[n2+1];LL n3=n1-(1LL<<n2);LL tmp;while(n3){ans+=n3;tmp=log2(n3);ans+=b[tmp+1];n3=n3-(1LL<<tmp);}}LL t=(1LL<<(n-1))+n1;LL pn=n-1, qn=x1-n1*n;while(pn&&qn){if(t&(1LL<<pn)){ans++;}pn--;qn--;}cout<<ans<<'\n';return 0;
}

3.3代码验证

将代码提交至洛谷,洛谷测试用例全部通过
在这里插入图片描述

四、小结

本文给出的代码较为粗糙,如果有更为简介高效的代码,请读者不吝指教。

该题目虽然并没有用到高难度的算法,但是对题目所含规律的发掘则需要一定的细心和耐心,在考场紧张的状态下解题的难度会进一步加大,并且发现规律后还需要考虑较多的细节,想要得分并不容易。

http://www.dtcms.com/wzjs/113360.html

相关文章:

  • 企业网站模板 html百度移动端排名软件
  • 个人网站建设的背景江门seo网站推广
  • 哪种公司一般会做网站各行业关键词
  • 富阳网站建设品牌宣传的推广
  • 百度网盟 网站定向seo网址
  • 企业网站推广属于付费河南网站排名优化
  • 炫酷的移动端网站网页制作网站
  • 有什么网站专做买生活污水设备目前最火的自媒体平台
  • 做网站意向客户今日头条热搜
  • 欧美做视频网站有哪些上海网络推广软件
  • 西安手机网站建设谷歌优化的最佳方案
  • 同一个服务器的网站做友情链接平面设计培训班学费一般多少
  • 人工智能设计系统公司最新seo操作
  • 深圳横岗网站建设网络营销推广计划
  • 东莞微信网站开发新东方教育培训机构
  • 做慧聪网站多少钱营销软件商城
  • 深圳响应式网站百度竞价开户3000
  • 昆明360网站制作经典软文案例或软文案例
  • 制作公司网页软件佛山seo关键词排名
  • 建设银行潍坊支行网站八大营销模式有哪几种
  • 美国网站建设深圳网站seo哪家快
  • 青岛市市南区疫情seo哪里可以学
  • 用GIF软件做的GIF 超出网站限制seo服务商
  • 外包公司做的网站怎么改密码互联网营销
  • 做海报有什么素材网站知乎电商网站建设教程
  • 节日网站设计网站平台有哪些
  • 保定网站建设优化站长工具seo综合查询工具
  • 在自己的电脑做网站空间seo教学平台
  • 网站截图环境 php北京营销公司排行榜
  • wordpress怎么设置用户收费seoul是哪个城市